Ich habe viel über das PyPy- Projekt gehört. Sie behaupten, es sei 6,3-mal schneller als der CPython- Interpreter auf ihrer Site .
Wenn wir über dynamische Sprachen wie Python sprechen, ist Geschwindigkeit eines der Hauptprobleme. Um dies zu lösen, sei PyPy 6,3-mal schneller.
Das zweite Problem ist die Parallelität, das berüchtigte Global Interpreter Lock (GIL). PyPy sagt, dass es GIL-weniger Python geben kann .
Wenn PyPy diese großen Herausforderungen lösen kann, welche Schwächen verhindern eine breitere Akzeptanz? Das heißt, was hindert jemanden wie mich, einen typischen Python-Entwickler, daran, gerade jetzt zu PyPy zu wechseln ?
Antworten:
PyPy unterstützt numpy nichtPyPy unterstützt jetzt numpy . Einige Erweiterungen werden immer noch nicht unterstützt (Pandas, SciPy usw.). Sehen Sie sich die Liste der unterstützten Pakete an, bevor Sie die Änderung vornehmen.ist derzeit experimentell.hat gerade stabil erreicht! Ab dem 20. Juni 2014 ist PyPy3 2.3.1 - Fulcrum da !Das sind die Hauptgründe, die mich betreffen, würde ich sagen.
quelle
np.sum(M[1:2*n**2:2, :2*n**2] * M[:2*n**2:2, :2*n**2].conjugate(), axis=1)
in Python äußerst ausdrucksstark ( ?) Und daher eignet sich Python sehr gut für die wissenschaftliche Gemeinschaft. Darüber hinaus ist es eine gängige und verwendbare Strategie, die nicht intensiven Teile in Python zu erledigen und die kleineren intensiven Schleifen an C zu senden.Diese Site behauptet nicht, dass PyPy 6,3-mal schneller als CPython ist. Zitieren:
Dies ist eine ganz andere Aussage als die pauschale Aussage, die Sie gemacht haben. Wenn Sie den Unterschied verstehen, werden Sie mindestens eine Reihe von Gründen verstehen, warum Sie nicht einfach "PyPy verwenden" sagen können. Es mag so klingen, als würde ich nicht picken, aber es ist wichtig zu verstehen, warum diese beiden Aussagen völlig unterschiedlich sind.
Um das aufzuschlüsseln:
Die Aussage, die sie machen, gilt nur für die Benchmarks, die sie verwendet haben. Es sagt absolut nichts über Ihr Programm aus (es sei denn, Ihr Programm entspricht genau einem ihrer Benchmarks).
Die Aussage bezieht sich auf einen Durchschnitt einer Gruppe von Benchmarks. Es besteht kein Anspruch darauf, dass das Ausführen von PyPy selbst für die von ihnen getesteten Programme eine 6,3-fache Verbesserung bringt.
Es gibt keinen Anspruch darauf, dass PyPy sogar alle Programme ausführt, die CPython überhaupt ausführt , geschweige denn schneller.
quelle
Da Pypy nicht zu 100% kompatibel ist, 8 GB RAM zum Kompilieren benötigt, ein sich bewegendes Ziel ist und sehr experimentell ist, wo cpython stabil ist, das Standardziel für Modulbauer seit 2 Jahrzehnten (einschließlich c-Erweiterungen, die auf Pypy nicht funktionieren) ) und bereits weit verbreitet.
Pypy wird wahrscheinlich nie die Referenzimplementierung sein, aber es ist ein gutes Werkzeug.
quelle
Die zweite Frage ist leichter zu beantworten: Sie im Grunde können PyPy als Drop-In-Ersatz verwenden, wenn Ihr gesamter Code reines Python ist. Viele weit verbreitete Bibliotheken (einschließlich einiger Standardbibliotheken) sind jedoch in C geschrieben und als Python-Erweiterungen kompiliert. Einige davon können für PyPy verwendet werden, andere nicht. PyPy bietet das gleiche "nach vorne gerichtete" Tool wie Python - das heißt, es ist Python -, aber seine Innereien sind unterschiedlich, sodass Tools, die mit diesen Innereien verbunden sind, nicht funktionieren.
Was die erste Frage betrifft, stelle ich mir vor, es ist eine Art Catch-22 mit der ersten: PyPy hat sich schnell weiterentwickelt, um die Geschwindigkeit zu verbessern und die Interoperabilität mit anderem Code zu verbessern. Dies hat es eher experimentell als offiziell gemacht.
Ich denke, es ist möglich, dass PyPy, wenn es in einen stabilen Zustand gerät, zunehmend verwendet wird. Ich denke auch, dass es für Python großartig wäre, sich von seinen C-Grundlagen zu entfernen. Aber es wird eine Weile nicht passieren. PyPy hat noch nicht die kritische Masse erreicht, bei der es allein fast nützlich genug ist, um alles zu tun, was Sie möchten, was die Leute motivieren würde, die Lücken zu füllen.
quelle
Ich habe einen kleinen Benchmark zu diesem Thema durchgeführt. Während viele der anderen Poster gute Punkte zur Kompatibilität gemacht haben, habe ich die Erfahrung gemacht, dass PyPy nicht viel schneller ist, wenn man sich nur um Teile bewegt. Für viele Anwendungen von Python gibt es tatsächlich nur die Übersetzung von Bits zwischen zwei oder mehr Diensten. Beispielsweise führen nicht viele Webanwendungen eine CPU-intensive Analyse von Datensätzen durch. Stattdessen nehmen sie einige Bytes von einem Client, speichern sie in einer Art Datenbank und geben sie später an andere Clients zurück. Manchmal wird das Format der Daten geändert.
Die BDFL- und CPython-Entwickler sind eine bemerkenswert intelligente Gruppe von Menschen, die es geschafft haben, CPython in einem solchen Szenario zu einer hervorragenden Leistung zu verhelfen. Hier ist ein schamloser Blog-Plug: http://www.hydrogen18.com/blog/unpickling-buffers.html . Ich verwende Stackless, das von CPython abgeleitet ist und die vollständige C-Modul-Schnittstelle beibehält. Ich habe in diesem Fall keinen Vorteil bei der Verwendung von PyPy gefunden.
quelle
F: Wenn PyPy diese großen Herausforderungen (Geschwindigkeit, Speicherverbrauch, Parallelität) im Vergleich zu CPython lösen kann, welche Schwächen verhindern eine breitere Akzeptanz?
A: Erstens gibt es kaum Anhaltspunkte dafür, dass das PyPy-Team das Geschwindigkeitsproblem im Allgemeinen lösen kann . Langfristige Beweise zeigen, dass PyPy bestimmte Python-Codes langsamer als CPython ausführt und dieser Nachteil sehr tief in PyPy verwurzelt zu sein scheint.
Zweitens verbraucht die aktuelle Version von PyPy in einer ziemlich großen Anzahl von Fällen viel mehr Speicher als CPython. PyPy hat das Problem des Speicherverbrauchs also noch nicht gelöst.
Ob PyPy die genannten großen Herausforderungen löst und im Allgemeinen schneller, weniger speicherhungrig und parallelitätsfreundlicher als CPython ist, ist eine offene Frage, die kurzfristig nicht gelöst werden kann. Einige Leute wetten, dass PyPy niemals eine allgemeine Lösung anbieten kann, die es ermöglicht, CPython 2.7 und 3.3 in allen Fällen zu dominieren.
Wenn es PyPy gelingt, besser als CPython im Allgemeinen zu sein, was fraglich ist, wird die Hauptschwäche, die sich auf seine breitere Akzeptanz auswirkt, die Kompatibilität mit CPython sein. Es gibt auch Probleme wie die Tatsache, dass CPython auf einer größeren Anzahl von CPUs und Betriebssystemen ausgeführt wird. Diese Probleme sind jedoch im Vergleich zu PyPys Leistungs- und CPython-Kompatibilitätszielen viel weniger wichtig.
F: Warum kann ich CPython jetzt nicht durch PyPy ersetzen?
A: PyPy ist nicht 100% kompatibel mit CPython, da es CPython nicht unter der Haube simuliert. Einige Programme hängen möglicherweise noch von den einzigartigen Funktionen von CPython ab, die in PyPy nicht vorhanden sind, z. B. C-Bindungen, C-Implementierungen von Python-Objekten und -Methoden oder der inkrementellen Natur des Garbage Collector von CPython.
quelle
CPython verfügt über Referenzzählung und Speicherbereinigung, PyPy verfügt nur über Speicherbereinigung.
Daher werden Objekte in der Regel früher gelöscht und
__del__
in CPython vorhersehbarer aufgerufen. Einige Softwareprogramme basieren auf diesem Verhalten und sind daher nicht für die Migration auf PyPy bereit.Einige andere Programme funktionieren mit beiden, verbrauchen jedoch weniger Speicher mit CPython, da nicht verwendete Objekte früher freigegeben werden. (Ich habe keine Messungen, die angeben, wie wichtig dies ist und welche anderen Implementierungsdetails die Speichernutzung beeinflussen.)
quelle
__del__
es selbst in CPython falsch ist , sich darauf zu verlassen, dass man früh oder überhaupt angerufen wird. Wie Sie es ausdrücken, funktioniert es normalerweise und einige Leute verstehen das als garantiert. Wenn irgendetwas, das auf das Objekt verweist, in einem Referenzzyklus gefangen ist (was ziemlich einfach ist - wussten Sie, dass das Überprüfen der aktuellen Ausnahme auf eine bestimmte, nicht erfundene Weise einen Referenzzyklus erzeugt?), Wird die Finalisierung auf unbestimmte Zeit bis zum nächsten GC-Zyklus verzögert (was vielleicht nie sein wird ). Wenn das Objekt selbst Teil eines Referenzzyklus ist,__del__
wird nicht aufgerufen wird überhaupt (vor Python 3.4).Bei vielen Projekten gibt es tatsächlich einen Unterschied von 0% zwischen den verschiedenen Pythons in Bezug auf die Geschwindigkeit. Dies sind diejenigen, die von der Engineering-Zeit dominiert werden und bei denen alle Pythons die gleiche Menge an Bibliotheksunterstützung haben.
quelle
Um dies zu vereinfachen: PyPy bietet die Geschwindigkeit, die CPython fehlt, opfert jedoch seine Kompatibilität. Die meisten Leute wählen Python jedoch wegen seiner Flexibilität und seiner "inklusive Batterie" -Funktion (hohe Kompatibilität), nicht wegen seiner Geschwindigkeit (es wird jedoch immer noch bevorzugt).
quelle
Ich habe Beispiele gefunden, bei denen PyPy langsamer als Python ist. Aber: Nur unter Windows.
Wenn Sie also an PyPy denken, vergessen Sie Windows. Unter Linux können Sie beeindruckende Beschleunigungen erzielen. Beispiel (alle Primzahlen zwischen 1 und 1.000.000 auflisten):
Dies läuft auf PyPy 10 (!) Mal schneller als auf Python. Aber nicht an Fenstern. Dort ist es nur 3x so schnell.
quelle
PyPy hat Python 3-Unterstützung für eine Weile, aber laut diesem HackerNoon-Beitrag von Anthony Shaw vom 2. April 2018 ist PyPy3 immer noch um ein Vielfaches langsamer als PyPy (Python 2).
Für viele wissenschaftliche Berechnungen, insbesondere Matrixberechnungen, ist Numpy die bessere Wahl (siehe FAQ: Soll ich Numpy oder Numpypy installieren? ).
Pypy unterstützt gmpy2 nicht. Sie können stattdessen gmpy_cffi verwenden obwohl ich die Geschwindigkeit nicht getestet habe und das Projekt 2014 eine Version hatte.
Bei Project Euler-Problemen verwende ich häufig PyPy und für einfache numerische Berechnungen ist dies häufig
from __future__ import division
für meine Zwecke ausreichend. Ab 2018 wird jedoch noch an der Python 3-Unterstützung gearbeitet, wobei Sie am besten auf 64-Bit-Linux setzen. Windows PyPy3.5 v6.0, spätestens ab Dezember 2018, befindet sich in der Beta.quelle
Unterstützte Python-Versionen
Um das Zen von Python zu zitieren :
Beispielsweise führte Python 3.7 Datenklassen und Python 3.8 fstring = ein .
Möglicherweise sind in Python 3.7 und Python 3.8 andere Funktionen enthalten, die für Sie wichtiger sind. Der Punkt ist, dass PyPy derzeit Python 3.7 oder Python 3.8 nicht unterstützt.
quelle