Warum wurde Python nicht wie moderne Javascript-Implementierungen optimiert?

11

Moderne Javascript-Implementierungen wie V8 (Chrome), SpiderMonkey (Firefox) und Chakra (IE / Edge) verfügen alle über eine JIT-Kompilierung und eine Reihe weiterer Optimierungen zur Verbesserung der Leistung.

Warum hat Python diese nicht?

Ich habe mir PyPy und IronPython angesehen, die beide Geschwindigkeitsgewinne beanspruchen. PyPy Ich verstehe nicht, wie eine in Python, einer interpretierten Sprache, geschriebene Python-Implementierung schneller ist als die Referenzimplementierung in C. IronPython, dieselbe Idee, aber ich sehe nicht, wie .NET Framework die Geschwindigkeit erhöht.

Jay
quelle
2
IronPython wird - wie jede andere .NET-Sprache - in die "Common Intermediate Language" von Microsoft kompiliert, für die es sehr ausgereifte JIT-Compiler-Implementierungen gibt.
Doc Brown
2
Eine Programmiersprache ist eine Spezifikation (in einem Dokument geschrieben), keine Software. Nur Implementierungen von Programmiersprachen sind Software (und können Compiler oder Interpreter sein).
Basile Starynkevitch
1
@BasileStarynkevitch: Ich verstehe nicht, was Sie uns mit diesem Kommentar sagen wollen. Die OP fragt explizit über CPython, PyPy und Ironpython, die sind Implementierungen spezifische Python.
Doc Brown
1
@DocBrown Scheint angesichts des letzten Absatzes in der Frage ein relevanter Punkt zu sein, der ein Missverständnis zeigt, wenn Python speziell als interpretierte Sprache bezeichnet wird.
8bittree

Antworten:

19

Warum hat Python diese nicht?

Ich bin mir nicht sicher, warum es Ihrer Meinung nach keine Python-Implementierungen gibt, die sich um die Leistung kümmern. PyPy , IronPython und Jython sind industrietaugliche, produktionsbereite Python-Implementierungen, bei denen die Leistung im Vordergrund steht. Pyston ist eine in der Entwicklung befindliche Implementierung, die speziell für die Leistung entwickelt wurde. Unladen Swallow und Psyco waren ebenfalls Projekte zur Verbesserung der Leistung von Python.

Die Tatsache, dass CPython-Benutzer die Gesamtzahl der kombinierten Benutzer aller anderen Implementierungen erheblich übersteigen, dass Unladen Swallow von der Community abgelehnt wurde, dass die meisten dieser Projekte entweder tot sind oder Schwierigkeiten haben, Entwickler anzulocken, sollte Ihnen etwas darüber erzählen, wie Python funktioniert Community schätzt Leistung.

Diese Antwort ist ein gutes Beispiel für die typische Mentalität der Python-Community: Anstatt die Leistungsprobleme zu beheben, würden sie es einfach vorziehen, ihren Code nicht in Python zu schreiben.

Ich habe mir PyPy und IronPython angesehen, die beide Geschwindigkeitsgewinne beanspruchen. PyPy Ich verstehe nicht, wie eine in Python, einer interpretierten Sprache, geschriebene Python-Implementierung schneller ist als die Referenzimplementierung in C.

Zunächst einmal: Es spielt keine Rolle, in welcher Sprache der Compiler geschrieben ist. Schließlich wird der Compiler nur einmal ausgeführt. Selbst wenn er langsam ist, spielt dies keine Rolle: Die Leistung des Compilers ist irrelevant, was relevant ist ist die Leistung der Ausgabe des Compilers.

Zweitens, da es nur darauf ankommt, wie schnell die Ausgabe des Compilers ist und der Compiler in Python geschrieben ist, dh in der Sprache, die er kompiliert, kann er sich selbst schnell machen, indem er sich selbst kompiliert.

Drittens gibt es keine "interpretierte Sprache". Eine Sprache besteht aus einer Reihe mathematischer Regeln und Einschränkungen. Es ist eine Spezifikation. Ein Stück Papier. Eine Sprache wird nicht kompiliert oder interpretiert. Eine Sprache einfach ist . Kompilierung und Interpretation sind Merkmale einer Sprachimplementierung , genauer gesagt eines Compilers oder Interpreters (duh!), Nicht der Sprache. Jede Sprache kann von einem Compiler implementiert werden. Jede Sprache kann von einem Dolmetscher implementiert werden. Sie können einen Compiler mechanisch aus einem Interpreter und einen Interpreter aus einem Compiler generieren.

Aber all dies spielt eigentlich keine Rolle, da PyPy eigentlich nicht in Python geschrieben ist. Es ist in RPython geschrieben . RPython besteht aus zwei Teilen, der RPython-Programmiersprache und dem RPython-Framework.

Die Programmiersprache RPython ist nicht Python. Es ist eine andere Programmiersprache. RPython ist eine statisch typisierte Programmiersprache, die in Bezug auf die Abstraktion ungefähr auf der gleichen Abstraktionsebene wie Java liegt und ungefähr die gleiche Leistung wie C aufweist. RPython ist eine syntaktische und semantische Teilmenge von Python, was bedeutet, dass jedes RPython-Programm ein gültiges Python-Programm ist und dies kann Sie werden von einer Python-Implementierung ausgeführt (wenn auch in der Regel mehrere Größenordnungen langsamer, dies ist jedoch für das Debuggen immer noch nützlich, da Sie Zugriff auf alle Python-Tools erhalten und die Interpretation sofort beginnt, während das Kompilieren der Sprachimplementierung in der Regel etwa 5 bis 10 Minuten dauert ), aber das Gegenteil ist nicht wahr.

Das RPython-Framework ist ein Framework zum Schreiben von Hochleistungsimplementierungen für dynamische Sprachen in der Programmiersprache RPython. Es enthält einen Garbage Collector, einen Objektbereich, ein Metaobjektprotokoll, vordefinierte Objekte, Typen und Operationen usw. Das Kronjuwel ist jedoch die Fähigkeit, automatisch einen JIT-Compiler aus einem Interpreter zu generieren: Wenn Sie eine Sprache im RPython-Framework implementieren, müssen Sie nur einen Interpreter schreiben, das RPython-Framework kümmert sich um die JIT.

Es gibt viele Sprachimplementierungen auf der RPython-Plattform , nicht nur PyPy.

IronPython, dieselbe Idee, aber ich sehe nicht, wie .NET Framework die Geschwindigkeit erhöhen wird.

Die meisten Implementierungen der ISO-CLI, wie die verschiedenen .NET-Varianten von Microsoft oder Mono, enthalten hochentwickelte Garbage Collectors, Optimierer und Compiler. Gleiches gilt für Jython- und Java-Implementierungen.

IronPython ist ein Compiler, der Python-Quellcode in DLR-Bäume kompiliert (DLR ist die Dynamic Language Runtime), die dann weiter in CIL-Bytecode kompiliert werden, der dann normalerweise wieder in nativen Maschinencode kompiliert wird.

Jörg W Mittag
quelle
6

Moderne Javascript-Implementierungen wie V8 (Chrome), SpiderMonkey (Firefox) und Chakra (IE / Edge) verfügen alle über eine JIT-Kompilierung und eine Reihe weiterer Optimierungen zur Verbesserung der Leistung.

Warum hat Python diese nicht?

JavaScript ist in Webbrowsern enthalten, und heutzutage ist eine beträchtliche Menge an Software für die Ausführung in Webbrowsern ausgelegt. Daher ist die Leistung von JavaScript sehr wichtig, sodass Unternehmen wie Google, Apple und Microsoft viele Ressourcen investieren, um die Laufzeit von JavaScript zu verkürzen. Wäre dieser Geldstrom nach Python umgeleitet worden, wäre er genauso schnell.

PyPy Ich verstehe nicht, wie eine in Python, einer interpretierten Sprache, geschriebene Python-Implementierung schneller ist als die Referenzimplementierung in C.

Die Idee ist, dass Code, sobald er JIT-ed ist, nicht mehr "interpretiert" wird. PyPI wandelt Python-Code in Maschinencode (z. B. x86_64-Maschinencode) um, der dann direkt auf dem Prozessor ausgeführt wird.

el.pescado
quelle
3
Besonders relevant ist, dass es im Webbrowser keine Alternative zu JavaScript gibt (oder zumindest noch nichts allgemein verfügbar in allen gängigen Browsern). Wenn Sie eine schnelle Leistung im Webbrowser wünschen, benötigen Sie eine schnelle JavaScript-Implementierung. Auf Plattformen, auf denen Python ausgeführt wird, können Sie mit ziemlicher Sicherheit in eine andere Sprache wechseln, die möglicherweise eine leistungsfähigere Implementierung aufweist.
8bittree
-3

Wenn Sie Ihren Python-Code in Module mit einem einfachen Start der obersten Ebene als Haupt-Python-Datei strukturieren (mit sehr wenig Code), kompiliert Python den gesamten Rest Ihres Codes in maschinenunabhängigen Bytecode .pyc-Dateien, die Sie in Ihrer Verzeichnisstruktur sehen. Dies minimiert die Lade- und Interpretationszeiten nach dem ersten Lauf.

Wenn Sie Ihr Skript mit den Flags -O oder -OO starten oder PYTHONOPTIMIZE auf einen Wert größer als 0 setzen, werden Pyo-Dateien generiert, die weiter optimiert werden.

Wenn Sie eine hohe Optimierung für bestimmte Funktionen benötigen, können Sie diese in C, C ++, FORTRAN oder GO schreiben und dann in Python verwenden.

Steve Barnes
quelle
Wie integrieren Sie Nicht-C-Erweiterungen in Python? Mir sind nur C-Erweiterungen für Cython bekannt.
1
@Bey: Grundsätzlich kann alles in einer gemeinsam genutzten Bibliothek (.dll oder .so) von Python aus aufgerufen werden, sofern Sie die Funktionssignaturen kennen. Diese können manuell konfiguriert, mit Tools wie Swing oder sogar aus Sauerstoffdokumentation generiert werden. stackoverflow.com/questions/5811949/… ist hilfreich, ebenso wie blog.heroku.com/see_python_see_python_go_go_python_go
Steve Barnes