14 Punkte von GN⁺ 2024-09-29 | 3 Kommentare | Auf WhatsApp teilen

Die wichtigsten Änderungen in Python 3.13

  • CPython v3.13.0 soll am 7. Oktober 2024 veröffentlicht werden
  • Diese Version enthält zwei wichtige Änderungen, die die Performance von Python stark beeinflussen könnten
    • eine „free-threaded“-Version, bei der sich der Global Interpreter Lock (GIL) deaktivieren lässt
    • experimentelle Unterstützung für Just-in-Time-(JIT-)Kompilierung

Global Interpreter Lock (GIL)

Was ist der GIL?

  • Python wurde Ende der 1980er Jahre von Guido Van Rossum als Single-Thread-Interpreter-Sprache entworfen und implementiert
  • Python kompiliert Quellcode zu Bytecode, den der Interpreter anschließend ausführt
  • Um sicher auf Objekte aus allen Threads zugreifen zu können, verwendet Python einen globalen Lock (GIL)
    • Dabei handelt es sich um einen globalen Mutex, der verhindert, dass mehrere Threads gleichzeitig Bytecode ausführen
  • Das schränkt die Nutzung von Shared Memory ein, ist aber gut für die Single-Thread-Performance

Warum Python einen GIL hat

  • Anfang der 1990er Jahre waren die meisten Programme Single-Thread-Anwendungen, und die Leistung einzelner CPU-Kerne stieg rapide
  • Es war nicht nötig, Single-Thread-Performance für Thread-Sicherheit zu opfern
  • Mehrere Kerne lassen sich über Multi-Processing nutzen (multiprocessing-Modul)

Warum wird der GIL jetzt entfernt?

  • Die Core-Entwickler von Python wollten den GIL schon lange entfernen, konnten das wegen der Sorge um schlechtere Single-Thread-Performance jedoch nicht umsetzen
  • Da Multi-Core-Systeme inzwischen allgegenwärtig sind, werden die durch den GIL verursachten Einschränkungen beim Multithreading zunehmend zum Problem
  • Das von Microsoft unterstützte Projekt „Faster CPython“ hat zur Verbesserung der Python-Performance beigetragen
  • Sam Gross schlug eine Implementierung ohne GIL vor, woraufhin PEP 703 angenommen wurde
  • Geplanter stufenweiser Rollout: experimentelle Option → offizieller Support → Standardmodus
  • Vor diesem Hintergrund wurde ein schrittweiser Plan zur Abschaffung des GIL genehmigt

Wie sieht es mit der Performance aus?

  • Wenn Free-Threading aktiviert ist, sinkt die Single-Thread-Performance um etwa 20 %
  • Multithreading mit deaktiviertem GIL zeigt deutliche Performance-Gewinne
  • Multithreading mit aktiviertem GIL ist langsamer als Single-Threading
  • Multithreading mit deaktiviertem GIL erreicht eine ähnliche Performance wie Multiprocessing

Wie nutzt man Free-Threading-Python?

  • Mit pyenv lässt sich Python 3.13.0rc2t installieren und damit die Free-Threading-Version nutzen
  • Standardmäßig ist der GIL deaktiviert; zur Laufzeit kann er mit -X gil=1 wieder aktiviert werden
  • Wenn ein Modul importiert wird, das GIL-free nicht unterstützt, wird der GIL automatisch aktiviert

JIT-(Just-in-Time-)Compiler

Was ist JIT?

  • Anders als bei traditioneller Ahead-of-Time-Kompilierung wird dabei direkt vor der Ausführung Machine Code erzeugt
  • Vor Python 3.13 wurde Bytecode einzeln in Maschinensprache umgewandelt und ausgeführt
  • Mit der Einführung von JIT kann Bytecode in einem Schritt in Maschinencode übersetzt und bei Bedarf aktualisiert werden
  • Die in Python 3.13 eingeführte Technik ist ein „copy-and-patch“-JIT, der zu vordefinierten Templates passenden Bytecode in Native Code patcht
  • Fortgeschrittenere JIT-Compiler können häufig ausgeführte „hot“-Bereiche des Codes optimieren

Welche Auswirkungen hat JIT?

  • Kurzfristig wird es beim Schreiben oder Ausführen von Python-Code keine großen Veränderungen geben
  • Es wird jedoch erwartet, dass schrittweise Performance-Verbesserungen Python wettbewerbsfähiger gegenüber anderen Sprachen machen

Wie nutzt man JIT?

  • In Python 3.13 ist JIT experimentell und standardmäßig nicht aktiviert
  • Es kann beim Build mit der Option PYTHON_CONFIGURE_OPTS="--enable-experimental-jit" aktiviert werden
  • Zur Laufzeit lässt sich die Aktivierung über PYTHON_JIT=0/1 steuern

Fazit

  • Python 3.13 ist ein großes Release, das interessante neue Konzepte und Funktionen in die Runtime einführt
    • Die Abschaffung des GIL und die Einführung von JIT deuten auf wichtige Veränderungen hin
  • Kurzfristig wird es zwar keine großen Umbrüche geben, langfristig dürfte sich die Python-Performance jedoch positiv entwickeln
    • Vor allem bei CPU-bound-Workloads werden Free-Threading und JIT voraussichtlich großen Einfluss auf die Performance haben, sobald sie ausgereift sind

Meinung von GN⁺

  • Dieses Python-3.13-Update dürfte dem Python-Ökosystem große Veränderungen bringen. Es wird erwartet, dass mit der Abschaffung des GIL Multithreading-Engpässe entschärft werden und sich durch die Einführung von JIT die allgemeine Ausführungsgeschwindigkeit verbessert.
  • Allerdings wird es Zeit brauchen, bis diese Änderungen vollständig stabil sind. Es kann zu Kompatibilitätsproblemen mit bestehenden Paketen wie C-Extensions kommen, und beim Multithreading können neue Bugs wie Race Conditions auftreten.
  • Die langsame Geschwindigkeit von Python wurde oft als Nachteil genannt; hoffentlich verbessert dieses Update diese Wahrnehmung. Wenn zu den bisherigen Stärken Produktivität und Lesbarkeit auch noch Geschwindigkeit hinzukommt, dürfte Python noch breiter eingesetzt werden.
  • Dennoch bleibt grundsätzlich die Grenze einer dynamisch typisierten Sprache bestehen. Die Bemühungen, die Vorteile statisch typisierter Sprachen zu übernehmen, sollten weitergehen. Durch den aktiven Einsatz von Type Hinting und Cython, die kürzlich in Python stärker Einzug gehalten haben, lässt sich das zum Teil lösen.
  • Insgesamt scheint Python 3.13 interessante und positive Veränderungen zu bringen. Es bleibt zu hoffen, dass Entwickler diese Änderungen gut verstehen und nutzen, um bessere Python-Programme zu schreiben

3 Kommentare

 
ilotoki0804 2024-09-30

Sowohl die Entfernung des GIL als auch JIT sind, auch wenn sie derzeit noch bescheiden wirken mögen, sehr wichtige Entwicklungen, die den Kurs von Python verändern werden. Es ist spannend zu sehen, wie Python den Ruf als „langsamste Sprache“ hinter sich lässt und künftig in noch mehr Bereichen eingesetzt werden wird.

 
ilotoki0804 2024-09-30

Die Bedeutung von Free Threading (Entfernung des GIL) wird in PEP 703 zusammen mit den Meinungen verschiedener Personen gut erläutert.
Außerdem soll laut diesem PEP der Leistungsverlust im Single-Thread-Betrieb nur 5~6 % betragen, daher ist die Behauptung in dem Artikel und in einigen HN-Kommentaren, es gebe einen Performance-Einbruch von 20~50 %, nur schwer nachvollziehbar. Eine überprüfbare Quelle dafür gibt es auch nicht.

 
GN⁺ 2024-09-29
Hacker-News-Kommentare
  • Die Meinung, dass das Entfernen des GIL gewöhnliche Python-Programme verlangsamen und die Komplexität erhöhen würde

    • Zweifel daran, welchen tatsächlichen Nutzen man dadurch gewinnt
    • Wenn mehrere CPU-Kerne maximal genutzt werden müssen, wird ein Ansatz verwendet, bei dem das OS mehrere Instanzen des Programms ausführt und so Parallelisierungslogik nicht dem Programm hinzugefügt werden muss
  • Beschwerde darüber, dass keine Version mit aktiviertem JIT heruntergeladen werden kann

    • Es wurde die Erfahrung geteilt, dass man Python 3.13 zwar selbst kompilieren kann, viele Leute das aber nicht ausprobieren und daher kein Feedback geben
  • Die Meinung, dass es ähnlich wie der Reim "Jack and Jill went up the hill" klingt

    • Es herrschte Verwirrung darüber, was "up the hill" bedeutet
    • Die Frage, ob zwar JIT veröffentlicht wurde, aber der GIL entfernt wurde oder nicht
  • Die Erfahrung, dass das Deaktivieren der Garbage Collection bei kleinen, speicherarmen Programmen mit kurzer Laufzeit die Geschwindigkeit stark verbessert

    • Die Frage, ob sich das automatisieren lässt
    • Hinweis auf das Risiko von Edge Cases, in denen kleine Programme den gesamten Speicher verbrauchen
  • Die Meinung, dass dies eine gute Zusammenfassung für Leute ist, die mit den ersten Diskussionen zur Entfernung des GIL im Jahr 2021 nicht zufrieden waren

  • Die Frage, ob es wirklich unmöglich ist, den Fall ohne GIL zu optimieren

    • Die Meinung, dass eine Verlangsamung um 20 % ein großes Problem ist
  • Die Nachricht, dass das Veröffentlichungsdatum vom 2. Oktober auf den 7. Oktober verschoben wurde

    • Ein entsprechender Link wurde bereitgestellt
  • Die Meinung, dass der Performance-Verlust von nogil zwar mit 20 % angegeben wird, aber bis zu 50 % betragen kann

    • Dass JIT nicht viel hilft
    • Die Meinung, dass dies eine enttäuschende Veröffentlichung ist, die die sozialen und unternehmerischen Probleme von CPython widerspiegelt
    • Die Behauptung, dass einige Leute Features versprechen, Menschen zum Schweigen bringen, die nicht zu 100 % begeistert sind, und dann Ergebnisse liefern, die hinter den Erwartungen zurückbleiben
  • Die Meinung, dass es ein überraschender Titel ist

  • Die Frage, ob jemand einen Link zu jüngeren Arbeiten zur automatischen Parallelisierung findet

    • Ein Link wurde geteilt zu einem Ansatz, bei dem man Single-Thread-Code schreibt und der Compiler Multithread-Code erzeugt