8 Punkte von GN⁺ 2024-01-10 | 1 Kommentare | Auf WhatsApp teilen

JIT-Compiler zu Python 3.13 hinzugefügt

  • Der CPython-Kernentwickler Brandt Bucher hat einen Pull Request eingereicht, um dem Python-3.13-Branch einen JIT-Compiler hinzuzufügen.
  • Diese Änderung dürfte eine der größten Veränderungen am CPython-Interpreter seit dem spezialisierten adaptiven Interpreter sein, der in Python 3.11 eingeführt wurde.

Was ist JIT?

  • JIT- (Just in Time) Kompilierung bezeichnet ein Design, bei dem der Code bei seiner ersten Ausführung kompiliert wird.
  • Ein JIT-Compiler ist ein Compiler, der Maschinencode erzeugt, im Gegensatz zu einem AOT- (Ahead of Time) Compiler.
  • Python-Code wird zunächst in Bytecode kompiliert; dieser Bytecode hat für die CPU keine direkte Bedeutung und wird über eine spezielle Bytecode-Interpreter-Schleife ausgeführt.

Was ist ein copy-and-patch JIT?

  • copy-and-patch JIT ist ein 2021 vorgeschlagenes Konzept, das als schneller Algorithmus für Laufzeitumgebungen dynamischer Sprachen entwickelt wurde.
  • Die Idee hinter copy-and-patch JIT ist, Anweisungen für jeden Befehl zu kopieren und Bytecode-Argumente einzusetzen (zu patchen).

Vor- und Nachteile von copy-and-patch JIT

  • Während ein „vollständiger“ JIT-Compiler Bytecode auf hoher Ebene in niedrigstufige Anweisungen einer Zwischensprache (IL) kompiliert, übersetzt copy-and-patch JIT Bytecode nach Maschinencode mithilfe einer Sammlung von Templates.
  • copy-and-patch JIT muss keine komplexe JIT-Compiler-Architektur innerhalb der Python-Laufzeit ausführen; es genügt, die LLVM-JIT-Werkzeuge auf dem Rechner zu installieren, der CPython aus dem Quellcode kompiliert.

Wie funktioniert dieser JIT?

  • Die neu zur API von Python 3.13 hinzugefügte API wird erweitert, damit zur Laufzeit ein einsteckbarer Optimierer erkannt werden kann.
  • Der neue JIT ist ein optionaler Optimierer für diese neue Architektur.
  • Wenn beim Kompilieren von CPython aus dem Quellcode das Flag --enable-experimental-jit angegeben wird, werden Maschinencode-Templates für Python-Bytecode erzeugt.

Ist dieser JIT schneller?

  • Erste Benchmarks zeigen eine Leistungssteigerung von etwa 2 bis 9 %.
  • Dieser JIT ist ein Grundpfeiler für eine Reihe von Optimierungen, die die Python-Performance deutlich verbessern können.

Meinung von GN⁺

  • Der in Python 3.13 hinzugefügte JIT-Compiler ist eine wichtige Veränderung zur Verbesserung der Ausführungsgeschwindigkeit von Python und kann insbesondere die Effizienz bei wiederholten Aufgaben erhöhen.
  • copy-and-patch JIT bietet einen innovativen Ansatz zur Leistungssteigerung, ohne dass eine komplexe JIT-Architektur in die Python-Laufzeit der Nutzer integriert werden muss.
  • Diese Technologie dürfte in der Python-Community spannende Diskussionen auslösen und voraussichtlich neue Möglichkeiten für die Performance-Optimierung von Python eröffnen.

1 Kommentare

 
GN⁺ 2024-01-10
Hacker-News-Kommentare
  • Die Leistungssteigerung von 2–9 % zwischen den Softwareversionen ist interessant. Solche kleinen Verbesserungen wirken manchmal enttäuschend, aber ich bevorzuge es, wenn sie sich kontinuierlich aufsummieren und jede Version schneller als die vorherige wird.
  • Es ist cool, dass die „Copy-and-Patch“-Technik von Haoran Xu und Fredrik Kjolstad Aufmerksamkeit bekommt. Ich bin ihr zuerst über Xus Blogbeitrag zu seinem LuaJIT-Remake-Projekt begegnet. Es wirkt sehr clever, wie bestehende Techniken wiederverwendet werden, um etwas Neues zu schaffen. Den Blogbeitrag würde ich allen empfehlen, die mehr über Sprachimplementierungen lernen wollen. Xu erklärt dort auch, dass die Verzögerung bei Blog-Updates auf Überarbeitungen im Hintergrund zurückzuführen war.
  • Brandt hat letztes Jahr beim CPython Core Developer Sprint einen Vortrag zu diesem Thema gehalten.
  • Trotz der Arbeit an PyPy, Jython, GraalPy und IronPython gilt die Aufnahme eines JIT in CPython als wichtige Entwicklung für das Python-Ökosystem. Besonders gespannt bin ich auf die Entwicklung nach Version 3.13.
  • Ich nutze Python für alles außer Webentwicklung, und wenn die Performance besser wird, ist das sehr positiv. Das Python-Ökosystem hat sich von zustandslosen Requests wie bei CGI oder mod_php hin zu lang laufenden Prozessen bewegt. Bedeutet das, dass man lokale Webanwendungen bei jeder Änderung neu starten muss? Einige Entwickler nutzen Methoden, die die Anwendung beim Speichern einer Datei automatisch neu starten.
  • Ich erinnere mich, dass CPython die Codebasis sehr einfach halten und Optimierungen anderen Implementierungen überlassen sollte.
  • Im Artikel wird der „Copy-and-Patch“-JIT als etwas Neues vorgestellt, aber ich erinnere mich, dass DOS QuickBASIC etwas Ähnliches verwendet hat. QuickBASIC hat Template-Assemblerblöcke im Speicher gepatcht und dabei ziemlich schlechten Assemblercode erzeugt.
  • Die Fortschritte bei der Python-Performance in den letzten zwei Jahren sind erstaunlich. Das Core-Team hat Performance-Verbesserungen zu einem ernsthaften Ziel gemacht und sichtbare Fortschritte erzielt.
  • Ich wünschte, es würde mehr Finanzierung in PyPy fließen. Bei kleinen Programmen ist die schnelle Startzeit dort aber nicht besonders gut, sodass man keinen großen Vorteil sieht. Bei großen Programmen können außerdem komplexe Kompatibilitätsprobleme auftreten. Wenn der JIT von CPython zuverlässiger ist oder schnellere Startzeiten hat, könnte das einige dieser Probleme lösen.
  • Die PR-Nachricht im GitHub-Repository von Python, die „Die Nacht vor Weihnachten“ parodiert, ist sehr witzig.