Python wird in Bereichen wie AI und Datenanalyse häufig verwendet und bietet den Vorteil, dass man schnell programmieren kann, aber das chronische Geschwindigkeitsproblem von Interpretersprachen bereitet in der Praxis oft Kopfzerbrechen.
In der Praxis zieht man verschiedene Alternativen in Betracht, um die Geschwindigkeitsprobleme von Python zu verbessern. Manchmal wird Python-Code nur für den ersten Prototyp verwendet und beim Übergang in die Produktion in Rust oder C/C++ neu entwickelt.
Ich entwickle experimentell ein neues Werkzeug namens Rextio als Alternative, um das Geschwindigkeitsproblem zu lösen, ohne Python aufzugeben.
Das grundlegende Konzept ist, die Teile von Python-Code, die nativ umgewandelt werden können (z. B. statischer Code mit Type Hints), automatisch in Rust-Code umzuwandeln und anschließend zu Binärdateien zu kompilieren, um die Performance zu steigern. Die Teile, die sich nur schwer automatisch nativ umwandeln lassen (z. B. dynamischer Code), bleiben unverändert als Python-Code erhalten (Fallback) und werden mit CPython ausgeführt, sodass die Logik des ursprünglichen Python-Codes erhalten bleibt.
Grob sieht das so aus:
Python-Projekt mit Typangaben
-> Analyse unterstützter nativer Kandidaten
-> Unsichere oder nicht unterstützte Funktionen ablehnen
-> Für akzeptierte Funktionen Rust + PyO3 erzeugen
-> Für den Rest Python-Fallback-Wrapper erzeugen
-> Import-kompatibles Artefakt bauen
Weitere Details finden sich in der Dokumentation des verlinkten Git repository.
Vergleicht man die Ausführung mit der von Rextio konvertierten nativen Binärdatei mit der Ausführung des ursprünglichen Python-Codes in CPython, ist auch ein Performancegewinn erkennbar.
- Bei der Ausführung von grundlegendem Python-Code nach nativer Konvertierung: 57.73×
- Bei der Ausführung von NumPy nach nativer Konvertierung: 2.52×
- Bei der Ausführung des Dijkstra-Algorithmus mit nativ konvertiertem NetworkX: 3.68×
- Bei der Ausführung von nativ konvertiertem
Series.mapaus pandas: 66.14× - Bei der Ausführung eines nativen PyTorch Deep MLP: 1.02× (begrenzte Beschleunigung, da bestehende Python-Pakete bereits C-Erweiterungen usw. verwenden)
- Bei der Ausführung einer nativen TensorFlow eager chain: 1.04× (begrenzte Beschleunigung, da bestehende Python-Pakete bereits C-Erweiterungen usw. verwenden)
Den im obigen Benchmark verwendeten Quellcode und Informationen zur Ausführungsumgebung finden Sie im rextio-benchmark Git repository.
Zur Einordnung: Rextio verfügt über eine Core CLI, die Python-Code umwandelt und die Kompilierung ausführt. Zusätzlich wird es so entwickelt, dass sich weitere Plugins anbinden lassen, die Regeln zur Umwandlung einzelner Python-Pakete in Rust-Code definieren. Derzeit sind bereits einige Plugins für NumPy usw. vorhanden (rextio-numpy, rextio-networkx, rextio-pandas, rextio-torch, rextio-tensorflow usw.), und die obigen Benchmark-Ergebnisse wurden unter Nutzung dieser Plugins erzielt.
Natürlich ist Rextio noch ein frühes Projekt mit viel Verbesserungspotenzial, und nicht in jeder Situation führt das Kompilieren von Python-Code zu nativem Code auf Rust-Basis zu einer Performanceverbesserung.
Wenn beispielsweise häufig Daten zwischen dem nativen Teil und dem CPython-Fallback-Teil ausgetauscht werden, kann es durch die Umwandlung der Daten beim Überschreiten der Grenze sogar zu Leistungseinbußen kommen. In solchen Fällen versucht Rextio jedoch, dies zu vermeiden, indem die betreffenden Teile vollständig auf CPython zurückfallen, ohne den nativen Pfad zu durchlaufen.
Ich habe das Projekt die ganze Zeit allein entwickelt und stelle es jetzt hier vor, weil es inzwischen eine gewisse Form angenommen hat.
Wenn Sie Fragen, Meinungen oder Feedback haben, werde ich mich bemühen, so gut wie möglich zu antworten und es zu berücksichtigen.
Vielen Dank.
Noch keine Kommentare.