Python 3.13: Bessere interaktive Shell und endlich Multithreading ohne GIL

vor 1 Tag 1

Mit einer leichten Verspätung auf der Zielgeraden ist Python 3.13 erschienen. Die neue interaktive Shell zielt auf besseren Komfort beim Entwickeln. Außerdem lässt sich der Global Interpreter Lock nun deaktivieren, um Multithreading-Anwendungen effizienter laufen zu lassen. Schließlich bringt die neue Version einen experimentellen Just-in-Time-Compiler (JIT) mit.

Ursprünglich war das Release für den 1. Oktober geplant, aber Performanceprobleme bei bestimmten Workloads erforderten letzten Feinschliff und einen zusätzlichen Release Candidate.

Python 3.13 setzt standardmäßig auf eine neue interaktive Shell, die aus dem PyPy-Projekt hervorgegangen ist und deutlich mehr Komfort bietet als die bisherige.

Die neue REPL (Read Eval Print Loop) erlaubt es, Codeblöcke aus mehreren Zeilen direkt zu editieren, statt zeilenweise durch die Befehlshistorie zu navigieren. Auch das Einfügen von Codeblöcken ist nun komfortabler: F3 aktiviert den "Paste Mode", der vollständige Inhalte einfügt, statt wie bisher bei Leerzeilen den Inhalt als beendet anzusehen.

Die Taste F2 aktiviert den History-Browse-Modus, der die vorgestellten Zeichen >>> und ... entfernt, damit sich der Code direkt kopieren lässt. Für mehr Übersicht bietet die REPL nun standardmäßig eine farbliche Syntaxhervorhebung für Prompts und Tracebacks.

Schließlich sind einige wesentliche Funktionen wie help und quit nun direkt als Kommandos integriert. Beispielsweise beendet die Eingabe von exit die Shell, statt wie bisher die Fehlermeldung anzuzeigen, dass man zum Beenden die exit()-Funktion aufrufen oder Strg+Z drücken solle.

Wer statt der neuen die alte interaktive Shell nutzen möchte oder aus Rückwärtskompatibilitätsgründen muss, kann sie über die Umgebungsvariable PYTHON_BASIC_REPL aktivieren.

im März fiel nach langer Vorbereitung und Diskussion die Entscheidung, in Python 3.13 ein Flag einzuführen, um den Global Interpreter Lock (GIL) zu deaktivieren. Der GIL soll Thread-Sicherheit garantieren, indem er dafür sorgt, dass jeweils nur ein Thread aktiv läuft. Allerdings kann Python damit das Potenzial von Multiprozessorsystemen beziehungsweise Mehrkernprozessoren nicht effizient nutzen.

Python 3.13 führt nun den sogenannten Free-Threaded Mode ein, der ohne Global Interpreter Lock arbeitet. Der Modus ist als experimentell gekennzeichnet, und die Beschreibung warnt davor, dass noch mit Bugs und deutlich verschlechterter Single-Threaded-Performance zu rechnen ist.

Für Anwendungen ohne GIL ist ein passendes Binary verfügbar, das für Windows und macOS Teil der offiziellen Installationspakete ist. Der GIL lässt sich schließlich über die Umgebungsvariable PYTHON_GIL oder den Kommandozeilenparameter -X gil=0 deaktivieren.

Ebenfalls als experimentell gilt der neue Just-in-Time-Compiler. Python ist standardmäßig eine interpretierte Sprache: CPython übersetzt den Sourcecode nicht in Maschinencode, sondern lediglich in Bytecode, den der Python-Interpreter zur Laufzeit interpretiert. Der Bytecode in den pyc-Dateien ist eine direkte Abbildung des Sourcecodes ohne Optimierungen – anders als bei kompilierten Sprachen wie C++ oder Rust.

Python 3.13 führt einen JIT-Compiler ein, der den Code zur Laufzeit in Maschinencode kompiliert, um die Performance zu verbessern. Der Pull Request vom Weihnachtstag (25. Dezember 2023) auf GitHub ist mit einem nett-nerdigen Weihnachtsgedicht gespickt.

Bei den Plattformen gibt es ebenfalls einige nennenswerte Entwicklungen: Das CPython-Projekt kennt drei Stufen (Tiers) für Betriebssysteme mit unterschiedlichen Anforderungen. Mit Python 3.13 gelten die mobilen Betriebssysteme Android und iOS als offizielle Plattformen auf dem niedrigsten Tier 3. WebAssembly ist nun im Zusammenspiel mit WASI (WebAssembly System Interface) in Tier 2, die Kombination mit Emscripten entfällt dafür im aktuellen Release.

Mit dem aktuellen Release verlängert sich der offizielle Supportzeitraum für die jährlichen Python-Releases: Ab Python 3.13 erhalten die Releases zwei Jahre vollen Support, denen drei Jahre Security-Fixes folgen. Bisher galt ein Support von eineinhalb Jahren mit darauffolgenden dreieinhalb Jahren Security-Fixes.

Weitere Neuerungen wie die Anpassung beim locals()-Built-in lassen sich der Python-Dokumentation entnehmen.

(rme)

Gesamten Artikel lesen