Aus dem Google Open Source Blog :
PyPy ist eine Neuimplementierung von Python in Python, bei der mithilfe fortschrittlicher Techniken versucht wird, eine bessere Leistung als CPython zu erzielen. Viele Jahre harter Arbeit haben sich endlich ausgezahlt. Unsere Geschwindigkeitsergebnisse übertreffen CPython häufig und reichen von etwas langsameren bis zu 2-fachen Beschleunigungen bei echtem Anwendungscode und bis zu 10-fachen Beschleunigungen bei kleinen Benchmarks.
Wie ist das möglich? Mit welcher Python-Implementierung wurde PyPy implementiert? CPython ? Und wie hoch sind die Chancen, dass ein PyPyPy oder PyPyPyPy ihre Punktzahl übertrifft?
(In einem ähnlichen Zusammenhang ... warum sollte jemand so etwas versuchen?)
python
pypy
language-implementation
Agnel Kurian
quelle
quelle
gcc
. Sie können also auch Python-Code schreiben, der auf CPython ausgeführt wird, der einen anderen Python-Code interpretiert, in C übersetztgcc
und das kompilierte Programm ausführt und dann ausführt. Und es könnte schneller sein, wenn der Code oft genug aufgerufen wird.Antworten:
Q1. Wie ist das möglich?
Die manuelle Speicherverwaltung (wie sie CPython beim Zählen ausführt) kann in einigen Fällen langsamer sein als die automatische Verwaltung.
Einschränkungen bei der Implementierung des CPython-Interpreters schließen bestimmte Optimierungen aus, die PyPy durchführen kann (z. B. feinkörnige Sperren).
Wie Marcelo erwähnte, ist die JIT. Wenn Sie den Typ eines Objekts im Handumdrehen bestätigen können, müssen Sie nicht mehr mehrere Zeiger-Dereferenzen durchführen, um schließlich zu der Methode zu gelangen, die Sie aufrufen möchten.
Q2. Mit welcher Python-Implementierung wurde PyPy implementiert?
Der PyPy-Interpreter ist in RPython implementiert, einer statisch typisierten Teilmenge von Python (der Sprache und nicht dem CPython-Interpreter). - Weitere Informationen finden Sie unter https://pypy.readthedocs.org/en/latest/architecture.html .
Q3. Und wie hoch sind die Chancen, dass ein PyPyPy oder PyPyPyPy ihre Punktzahl übertrifft?
Das würde von der Implementierung dieser hypothetischen Interpreten abhängen. Wenn einer von ihnen zum Beispiel die Quelle genommen, eine Art Analyse durchgeführt und sie nach einer Weile direkt in engen zielspezifischen Assembler-Code konvertiert hätte, wäre sie meiner Meinung nach ziemlich schneller als CPython.
Update: Vor kurzem hat PyPy in einem sorgfältig ausgearbeiteten Beispiel ein ähnliches C-Programm übertroffen, mit dem kompiliert wurde
gcc -O3
. Es ist ein erfundener Fall, zeigt aber einige Ideen.Q4. Warum sollte jemand so etwas versuchen?
Von der offiziellen Seite. https://pypy.readthedocs.org/en/latest/architecture.html#mission-statement
Der C-Compiler gcc ist in C implementiert. Der Haskell-Compiler GHC ist in Haskell geschrieben. Haben Sie einen Grund dafür, dass der Python-Interpreter / Compiler nicht in Python geschrieben wurde?
quelle
"PyPy ist eine Neuimplementierung von Python in Python" ist eine ziemlich irreführende Art, PyPy zu beschreiben, IMHO, obwohl es technisch wahr ist.
Es gibt zwei Hauptteile von PyPy.
Das Übersetzungsframework ist ein Compiler. Es kompiliert RPython- Code bis auf C (oder andere Ziele) und fügt automatisch Aspekte wie die Garbage Collection und einen JIT-Compiler hinzu. Es kann keinen beliebigen Python-Code verarbeiten, nur RPython.
RPython ist eine Teilmenge von normalem Python. Der gesamte RPython-Code ist Python-Code, aber nicht umgekehrt. Es gibt keine formale Definition von RPython, da RPython im Grunde nur "die Teilmenge von Python ist, die vom PyPy-Übersetzungsframework übersetzt werden kann". Um übersetzt zu werden, muss RPython-Code statisch typisiert sein (die Typen werden abgeleitet, Sie deklarieren sie nicht, aber es ist immer noch nur ein Typ pro Variable), und Sie können keine Funktionen wie das Deklarieren / Ändern von Funktionen ausführen. Klassen auch zur Laufzeit.
Der Interpreter ist dann ein normaler Python-Interpreter, der in RPython geschrieben ist.
Da RPython-Code normaler Python-Code ist, können Sie ihn auf jedem Python-Interpreter ausführen. Aber keiner der Geschwindigkeitsansprüche von PyPy beruht darauf, dass es so läuft. Dies ist nur für einen schnellen Testzyklus gedacht, da die Übersetzung des Dolmetschers lange dauert .
Vor diesem Hintergrund sollte sofort klar sein, dass Spekulationen über PyPyPy oder PyPyPyPy eigentlich keinen Sinn ergeben. Sie haben einen in RPython geschriebenen Interpreter. Sie übersetzen es in C-Code, der Python schnell ausführt. Dort stoppt der Prozess; Es gibt kein RPython mehr, das durch erneutes Verarbeiten beschleunigt werden könnte.
"Wie ist es möglich, dass PyPy schneller als CPython ist?" Wird auch ziemlich offensichtlich. PyPy hat eine bessere Implementierung, einschließlich eines JIT-Compilers (ohne den JIT-Compiler ist es meiner Meinung nach im Allgemeinen nicht ganz so schnell, was bedeutet, dass PyPy nur für Programme schneller ist, die für die JIT-Kompilierung anfällig sind). CPython wurde nie als hochoptimierende Implementierung der Python-Sprache entwickelt (obwohl sie versuchen, sie zu einer hochoptimierten Implementierung zu machen , wenn Sie dem Unterschied folgen).
Das wirklich Innovative am PyPy-Projekt ist, dass sie keine ausgeklügelten GC-Schemata oder JIT-Compiler von Hand schreiben. Sie schreiben den Interpreter relativ einfach in RPython, und für alle RPython-Versionen ist es eine niedrigere Ebene als Python. Es ist immer noch eine objektorientierte, durch Müll gesammelte Sprache, viel höher als C. Dann fügt das Übersetzungs-Framework automatisch Dinge wie GC und JIT hinzu. Das Übersetzungs-Framework ist also riesigDies gilt jedoch auch für den PyPy-Python-Interpreter. Er ändert jedoch seine Implementierung und ermöglicht so viel mehr Freiheit beim Experimentieren, um die Leistung zu verbessern (ohne sich Gedanken über die Einführung von GC-Fehlern oder die Aktualisierung des JIT-Compilers zu machen, um mit den Änderungen fertig zu werden). Dies bedeutet auch, dass bei der Implementierung eines Python3-Interpreters automatisch dieselben Vorteile erzielt werden. Und alle anderen Interpreten, die mit dem PyPy-Framework geschrieben wurden (von denen es eine Reihe in verschiedenen Phasen der Politur gibt). Alle Interpreter, die das PyPy-Framework verwenden, unterstützen automatisch alle vom Framework unterstützten Plattformen.
Der wahre Vorteil des PyPy-Projekts besteht also darin, alle Teile der Implementierung eines effizienten plattformunabhängigen Interpreters für eine dynamische Sprache (so weit wie möglich) zu trennen. Und dann finden Sie eine gute Implementierung an einem Ort, die von vielen Dolmetschern wiederverwendet werden kann. Das ist kein sofortiger Gewinn wie "Mein Python-Programm läuft jetzt schneller", aber es ist eine großartige Perspektive für die Zukunft.
Und es kann Ihr Python-Programm (vielleicht) schneller ausführen.
quelle
PyPy ist in Python implementiert, implementiert jedoch einen JIT-Compiler, um nativen Code im laufenden Betrieb zu generieren.
Der Grund für die Implementierung von PyPy auf Python ist wahrscheinlich, dass es sich lediglich um eine sehr produktive Sprache handelt, zumal der JIT-Compiler die Leistung der Hostsprache etwas irrelevant macht.
quelle
PyPy ist in Restricted Python geschrieben. Soweit ich weiß, läuft es nicht auf dem CPython-Interpreter. Eingeschränktes Python ist eine Teilmenge der Python-Sprache. AFAIK, der PyPy-Interpreter wird zu Maschinencode kompiliert, sodass bei der Installation zur Laufzeit kein Python-Interpreter verwendet wird.
Ihre Frage scheint zu erwarten, dass der PyPy-Interpreter während der Ausführung von Code auf CPython ausgeführt wird. Bearbeiten: Ja, um PyPy zu verwenden, übersetzen Sie zuerst den PyPy-Python-Code, entweder in C und erstellen mit gcc, in JVM-Byte-Code oder in .NET-CLI-Code. Siehe Erste Schritte
quelle