Frage

Von der Google Open Source Blog :

  

PyPy ist eine Neuimplementierung von Python   in Python, mit Hilfe modernster Techniken   um zu versuchen, eine bessere Leistung zu erzielen   als CPython. Viele Jahre harter Arbeit   haben sich gelohnt. unsere Geschwindigkeit   Ergebnisse schlagen oft CPython, angefangen   von etwas langsamer ist, bis   speedups von bis zu 2x auf realen   Anwendungscode zu speedups von bis zu   10x auf kleines Benchmarks.

Wie ist das möglich? Welche Python-Implementierung wurde verwendet PyPy zu implementieren? CPython ? Und was sind die Chancen auf eine PyPyPy oder PyPyPyPy schlagen ihre Punktzahl?

(Über einen entsprechenden Hinweis ... warum sollte jemand versuchen, so etwas wie das?)

War es hilfreich?

Lösung

Q1. Wie ist das möglich?

manuelle Speicherverwaltung (das ist, was CPython mit seiner Zählung der Fall ist) kann langsamer sein als die automatische Verwaltung in einigen Fällen.

Einschränkungen bei der Umsetzung des CPython Interpreter preclude bestimmte Optimierungen, dass PyPy tun können (z. B. feinkörnig Schlösser).

Als Marcelo erwähnt, die JIT. Die Möglichkeit, die Art eines Objekts on the fly bestätigen können Sie die Notwendigkeit, speichern mehrere Zeiger Dereferenzierungen tun an der Methode, die Sie anrufen wollen, um endlich ankommen.

Q2. Welche Python-Implementierung wurde verwendet, um PyPy zu implementieren?

Die PyPy Interpreter in RPython implementiert, die eine statisch typisierte Teilmenge von Python ist (die Sprache und nicht der CPython Interpreter). - Siehe https://pypy.readthedocs.org/en/latest/architecture.html für Details.

Q3. Und was sind die Chancen auf eine PyPyPy oder PyPyPyPy schlagen ihre Punktzahl?

Das würde auf die Umsetzung dieser hypothetischen Dolmetscher ab. Wenn einer von ihnen zum Beispiel die Quelle nahm, eine Art von Analyse tat es und wandelte sie direkt in engen zielspezifische Assembler-Code nach für eine Weile laufen, stelle ich mir es wäre als CPython ganz schneller sein.

Update: Vor kurzem auf einem sorgfältig gearbeitete Beispiel übertraf PyPy ein ähnliches C-Programm mit gcc -O3 zusammengestellt. Es ist ein erfundener Fall aber einige Ideen nicht aufweist.

Q4. Warum sollte jemand versuchen, so etwas wie das?

Von der offiziellen Website. https://pypy.readthedocs.org/en/latest/architecture.html # mission-Anweisung

  

Wir wollen bieten:

     
      
  • eine gemeinsame Übersetzung und Förderkonzept für
    Herstellung   Implementierungen von dynamischen Sprachen, eine saubere
    betont   Trennung zwischen Sprache Spezifikation und Implementierung
      Aspekte. Wir nennen dies die RPython toolchain _.

  •   
  • eine nachgiebige, flexible und schnelle Umsetzung der Python_   Sprache, die die oben Werkzeugkette nutzt fortschrittliche, um neue   High-Level-Funktionen, ohne dass das Low-Level zu codieren, mit   Details.

  •   
     

Mit dem Anliegen auf diese Weise zu trennen, unsere Implementierung von Python - und   andere dynamische Sprachen - in der Lage, automatisch eine generieren   Just-in-Time-Compiler für jede dynamische Sprache. Es ermöglicht auch eine   Mix-and-Match Ansatz für die Umsetzung Entscheidungen, darunter auch viele   dass hat außerhalb eines Benutzers Kontrolle historisch gewesen, wie   Zielplattform, Gedächtnis und Threadingmodelle, garbage collection   Strategien und Optimierungen angewandt, einschließlich, ob oder nicht   haben einen JIT an erster Stelle.

Der C-Compiler gcc in C implementiert wird, wird der Haskell Compiler GHC in Haskell geschrieben. Haben Sie einen Grund für das Python-Interpreter / Compiler nicht in Python geschrieben werden?

Andere Tipps

„PyPy ist eine Neuimplementierung von Python in Python“ ist ein eher irreführend PyPy, IMHO zu beschreiben, obwohl es technisch wahr ist.

Es gibt zwei große Teile PyPy.

  1. Die Übersetzung Rahmen
  2. Der Interpreter

Die Übersetzung Framework ist ein Compiler. Es kompiliert RPython Code bis zu C (oder einer anderen Targets), automatisch in das Hinzufügen Aspekte wie Garbage Collection und einem JIT-Compiler. Es kann nicht handle beliebigen Python-Code, nur RPython.

RPython ist eine Teilmenge von normalen Python; RPython Code ist alles Python-Code, aber nicht umgekehrt. Es gibt keine formale Definition RPython, weil RPython im Grunde nur „die Teilmenge von Python, die von PyPy Übersetzung Rahmen übersetzt werden kann“. Aber um übersetzt zu werden, hat RPython Code zu statisch typisierten (die Typen sind geschlossen, Sie sie nicht erklären, aber es ist nach wie vor streng eine Art pro Variable), und Sie können nicht tun Dinge wie deklarieren / entweder Funktionen / Klassen zur Laufzeit zu ändern.

Der Interpreter dann ist ein normales Python-Interpreter in RPython geschrieben.

Da RPython Code normaler Python-Code ist, können Sie es auf jedem Python-Interpreter ausführen. Aber keiner von PyPy der Geschwindigkeit Ansprüchen kommen, um es auf diese Weise vom Laufen; dies ist nur für einen schnellen Testzyklus, weil der Dolmetscher übersetzt ein dauert lange Zeit.

Damit verstanden, sollte es sofort offensichtlich, dass Spekulationen über PyPyPy oder PyPyPyPy nicht wirklich keinen Sinn. Sie haben einen Dolmetscher in RPython geschrieben. Sie übersetzen es in C-Code, der Python führt schnell. Dort wird der Prozess beendet; gibt es nicht mehr RPython wieder durch die Verarbeitung es zu beschleunigen.

So „Wie ist es möglich, PyPy schneller als CPython zu sein“ auch ziemlich offensichtlich wird. PyPy hat eine bessere Umsetzung, einschließlich einem JIT-Compiler (es ist in der Regel nicht ganz so schnell, ohne die JIT-Compiler, glaube ich, was bedeutet, PyPy ist nur schneller für Programme anfällig für JIT-Kompilierung). CPython wurde nie eine hochoptimierende Umsetzung der Sprache Python sein entworfen (obwohl sie versuchen es zu einer sehr optimiertem Implementierung zu machen, wenn Sie den Unterschied folgen).


Die wirklich innovative Bit des PyPy Projektes ist, dass sie nicht schreiben anspruchsvolle GC Systeme oder JIT-Compiler von Hand. Sie schreiben den Interpreter relativ unkompliziert in RPython, und für alle RPython ist niedrigeren Niveau als Python es ist immer noch eine objektorientierte Müll Sprache gesammelt, viel mehr hohe Niveau als C. Dann wird die Übersetzung Rahmen automatisch fügt Dinge wie GC und JIT. So ist die Übersetzung Framework ist eine großen Mühe, aber es gilt gleichermaßen für die PyPy Python-Interpreter aber sie deren Umsetzung zu ändern, so dass für viel mehr Freiheit in Experimenten zur Verbesserung der Leistung (ohne sich Gedanken über die Einführung GC Bugs oder den JIT-Compiler der Aktualisierung mit den Veränderungen fertig zu werden). Es bedeutet auch, wenn sie bekommen um einen Python3 Interpreter Umsetzung, wird es automatisch die gleichen Vorteile erhalten. Und alle anderen Dolmetscher mit dem Rahmen PyPy geschrieben (von denen gibt es eine Reihe in unterschiedlichen Stadien der polnisch). Und alle Dolmetscher die PyPy Framework automatisch alle Plattformen vom Framework unterstützt unterstützen.

So ist der wahre Nutzen des PyPy Projektes zu trennen (so viel wie möglich) alle Teile ein effizientes plattformunabhängigen Interpreter für eine dynamische Sprache zu implementieren. Und dann kommen mit einer guten Implementierung von ihnen an einem Ort, die wieder verwendet für viele Dolmetscher sein. Das ist nicht ein sofortiger Gewinn wie „mein Python-Programm läuft jetzt schneller“, aber es ist eine große Perspektive für die Zukunft.

Und es kann Ihr Python-Programm schneller (vielleicht) ausgeführt werden.

ist PyPy in Python implementiert, aber es implementiert ein JIT-Compiler on the fly nativen Code zu erzeugen.

Der Grund PyPy oben auf Python zu implementieren, ist wahrscheinlich, dass es einfach eine sehr produktive Sprache ist, vor allem, da die JIT-Compiler der Host-Sprache der Leistung etwas irrelevant machen.

PyPy wird in Restricted Python geschrieben. Es muss nicht auf dem CPython-Interpreter ausführen, soweit ich weiß. Restricted Python ist eine Teilmenge der Sprache Python. AFAIK ist der PyPy Interpreter in Maschinencode kompiliert, so installiert, wenn es nicht ein Python-Interpreter zur Laufzeit nicht nutzen.

Ihre Frage scheint die PyPy zu erwarten Dolmetscher auf der CPython ausgeführt wird, während die Ausführung von Code. Edit: Ja, verwendet PyPy Sie zuerst den PyPy Python-Code übersetzen, entweder zu C und bauen mit gcc, zu Jvm Byte-Code oder auf .Net CLI Code. Siehe Erste Schritte

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top