Warum sollte ich PyPy nicht über CPython verwenden, wenn PyPy 6,3-mal schneller ist?

684

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 ?

chhantyal
quelle
30
Bereinigte Kommentare, da die meisten Dinge entweder in Antworten konkretisiert werden sollten (und in einigen Fällen auch sind) oder überhaupt nicht gesagt werden sollten. Auch bearbeitet, um einige der Bedenken hinsichtlich der Subjektivität dieser Frage auszuräumen. Bitte versuchen Sie, mit Fakten zu antworten und Aussagen möglichst mit Quellen zu untermauern!
Shog9
3
Ich habe Pypy viel benutzt. Es funktioniert sehr gut. Während Pypy für viele CPU-schwere Workloads etwas schneller ist, ist es für die E / A-hohen Workloads, die ich darauf geworfen habe, tatsächlich langsamer. Zum Beispiel habe ich ein deduplizierendes Backup-Programm namens Backshift geschrieben. Für eine erste Sicherung, bei der viele Dateien aufgeteilt werden, ist pypy großartig. Bei nachfolgenden Sicherungen, bei denen meist nur Zeitstempel aktualisiert werden, ist CPython jedoch schneller.
Dstromberg

Antworten:

657

HINWEIS: PyPy ist jetzt ausgereifter und wird besser unterstützt als 2013, als diese Frage gestellt wurde. Vermeiden Sie es, aus veralteten Informationen Schlussfolgerungen zu ziehen.


  1. Wie andere bereits erwähnt haben, unterstützt PyPy C-Erweiterungen nur wenig . Es hat Unterstützung, aber normalerweise langsamer als Python und es ist bestenfalls zweifelhaft. Daher benötigen viele Module einfach CPython. PyPy unterstützt numpy nicht PyPy 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.
  2. Die Unterstützung von Python 3 ist derzeit experimentell. hat gerade stabil erreicht! Ab dem 20. Juni 2014 ist PyPy3 2.3.1 - Fulcrum da !
  3. PyPy ist für "Skripte", für die viele Leute Python verwenden, manchmal nicht schneller. Dies sind die kurzfristigen Programme, die etwas Einfaches und Kleines tun. Da PyPy ein JIT-Compiler ist, ergeben sich seine Hauptvorteile aus langen Laufzeiten und einfachen Typen (z. B. Zahlen). Ehrlich gesagt sind die Pre-JIT-Geschwindigkeiten von PyPy im Vergleich zu CPython ziemlich schlecht .
  4. Trägheit . Der Wechsel zu PyPy erfordert häufig ein Umrüsten, was für manche Menschen und Organisationen einfach zu viel Arbeit ist.

Das sind die Hauptgründe, die mich betreffen, würde ich sagen.

Veedrac
quelle
14
Schön, dass Sie das Umrüsten erwähnen. Mein Webhost hat beispielsweise die Wahl zwischen Python 2.4 und 2.5. und ein "großer Hersteller von Unterhaltungssoftware" in meiner Nähe verwendet 2.6, ohne dass ein baldiges Upgrade geplant ist. Manchmal kann es ein großer und kostspieliger Aufwand sein, die Kosten einer Konvertierung zu ermitteln.
Mike Housky
19
Bei PyPy, das "so schnell wie C" ist, geht es mehr um generisches C als um hochoptimierte C-Bibliotheken mit Multithread-Cache, die für die Numerik verwendet werden. Für die Numerik wird Python nur verwendet, um Zeiger auf große Arrays zu umgehen. Wenn PyPy "so schnell wie C" ist, bedeutet dies, dass "Ihre Zeiger + Metadaten so schnell wie C verschoben werden". Keine große Sache. Warum sollte man sich dann überhaupt mit Python beschäftigen? Schauen Sie sich die Funktionssignaturen in cblas und lapacke an.
cjordan1
12
@ cjordan1: Ich verstehe nicht, was du sagst. Die hochstufigen Numpy-Konstrukte sind 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.
Veedrac
26
@Veedrac Das habe ich gemeint. Wie in "Sehen Sie sich die Funktionssignaturen in cblas und lapacke an", weil sie so lang und schwierig zu verwenden sind, dass Sie sofort verstehen, warum wir Python verwenden, um die Zeiger und Metadaten zu umgehen.
cjordan1
5
@ tommy.carstensen Dies ist kein wirklich guter Ort, um in die Tiefe zu gehen, aber ich werde es versuchen. 1. Das war viel wahrer, als ich es geschrieben habe, als es jetzt ist. 2. "Skripte" sind oft IO-lastig. PyPys E / A ist immer noch oft langsamer als das von CPython - früher war es deutlich langsamer. 3. PyPy war früher langsamer als CPython im Umgang mit Strings - jetzt ist es oft besser und selten schlechter. 4. Viele "Skripte" sind nur Klebercode. Wenn Sie den Interpreter schneller machen, wird die Gesamtlaufzeit in diesem Fall nicht verbessert. 5. Die Aufwärmzeiten von PyPy waren früher länger - kurz laufende Skripte konnten selten viel heißen Code produzieren.
Veedrac
104

Diese Site behauptet nicht, dass PyPy 6,3-mal schneller als CPython ist. Zitieren:

Der geometrische Durchschnitt aller Benchmarks ist 0,16- oder 6,3-mal schneller als bei CPython

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.

Spookylukey
quelle
15
Natürlich gibt es keinen Anspruch darauf, dass PyPy den gesamten Python-Code schneller ausführt. Wenn Sie jedoch alle reinen Python-Anwendungen verwenden, kann ich wetten, dass die meisten von ihnen auf PyPy viel schneller (> dreimal) als auf CPython ausgeführt werden.
Robert Zaremba
18
Keiner Ihrer ersten beiden Aufzählungspunkte ist sinnvoll. Wie können Sie sagen, dass Benchmarks "absolut nichts über Ihr Programm" sagen? Es ist ziemlich offensichtlich, dass Benchmarks kein perfekter Indikator für alle realen Anwendungen sind, aber sie können definitiv als Indikator nützlich sein. Ich verstehe auch nicht, was Sie irreführend finden, wenn sie den Durchschnitt einer Gruppe von Benchmarks angeben. Sie geben ziemlich klar an, dass es ein Durchschnitt ist. Wenn ein Programmierer nicht versteht, was ein Durchschnitt ist, hat er viel ernstere Bedenken als die Sprachleistung.
Sean Geoffrey Pietz
6
@SeanGeoffreyPietz - Ich habe nicht behauptet, dass PyPys Website in irgendeiner Weise irreführend ist - sie haben ihre Ergebnisse korrekt präsentiert. Aber die ursprüngliche Frage zitierte sie falsch und zeigte, dass der Autor die Bedeutung des Wortes "Durchschnitt" nicht verstand. Viele der einzelnen Benchmarks sind nicht 6,3-mal schneller. Und wenn Sie einen anderen Durchschnittstyp verwenden, erhalten Sie einen anderen Wert, sodass "6,3 x schneller" keine angemessene Zusammenfassung von "geometrischer Durchschnitt ist 6,3 x schneller" ist. "Gruppe A ist Z-mal schneller als Gruppe B" ist zu vage, um sinnvoll zu sein.
Spookylukey
6
-1: @spookylukey Sie scheinen zu vermuten, dass die Benchmark-Suite voreingenommen ist, ohne Beweise für die Behauptung vorzulegen. Kritik sollte immer mit Beweisen belegt werden!
Evgeni Sergeev
5
@ EvgeniSergeev - nein, ich impliziere, dass alle Benchmarks voreingenommen sind! Natürlich nicht unbedingt absichtlich. Der Raum möglicher nützlicher Programme ist unendlich und unglaublich vielfältig, und eine Reihe von Benchmarks misst immer nur die Leistung dieser Benchmarks. Fragen "Wie viel schneller ist PyPy als CPython?" ist wie zu fragen "wie viel schneller wenn Fred als Joe?", was das OP zu wissen scheint.
Spookylukey
74

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.

Tritium21
quelle
2
Laut pypy.org/download.html benötigt PyPy 4 GB RAM zum Kompilieren (auf einem 64-Bit-System), nicht 8. Auf dieser Seite gibt es die Möglichkeit, dies bei Bedarf unter 3 GB zu tun.
Stricken
4
@knite 1: das ist neu ab 2015, die Dokumentation hat historisch 8 GB gelesen. 2: In der Praxis im Jahr 2015 benötigen Sie noch mindestens 8, wobei 6-7 frei sind.
Tritium21
4
Der zu kompilierende Speicherbedarf ist nicht so relevant, wenn Sie einen Build oder eine Distribution verwenden . Können Sie in Bezug auf "bewegliches Ziel und sehr experimentell" einige Beispiele für Dinge nennen, die kaputt gehen? Wenn Benutzer Release-Builds anstelle von nächtlichen Builds oder Quellen verwenden, haben sie dann keine vernünftigen Erwartungen an die Funktionalität?
smci
@smci Dies ist eine alte Frage, die auf alten Daten basiert und alte Antworten enthält. Betrachten Sie diese Frage und jede Antwort als historisch für den Zustand des Pypy vor 4 Jahren.
Tritium21
1
@ Tritium21: Mich interessiert nur die aktuelle Antwort. Was ist es? Möglicherweise möchten Sie Ihre Antwort so bearbeiten, dass "Ab 2013 war der Vergleich von pypy mit Version 2.x von Python ...". Auch wenn die Behauptung "6.3x geometrischer Durchschnitt" in der Frage veraltet ist ( as von 4/2017 behaupten sie 7,5x, aber selbst dann hängt es von den Benchmarks ab ... ), dann muss das auch bearbeitet werden (Versionsnummern, neueste Daten usw.) Ich denke, die Benchmark-Suite ist nicht sehr relevant, kaum jemand würde laufen Raytracing in einer Skriptsprache auf einer CPU in diesen Tagen. Ich habe pybenchmarks.org
smci
36

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.

BrenBarn
quelle
17
Ich glaube nicht, dass C eine Sprache ist, die bald irgendwohin geht (ich würde sagen, sie wird in unserem Leben nicht verschwinden). Bis es eine andere Sprache gibt, die irgendwo ausgeführt wird, haben wir C. (Beachten Sie, dass die JVM in C geschrieben ist. Sogar Java, die Sprache, die "überall läuft", benötigt C für ihre Allseitigkeit.) Ansonsten stimme ich diesem Beitrag in den meisten Fällen zu seiner Punkte.
Tritium21
7
@ Tritium21: Ja, ich redaktioniere nur dort. Ich bin damit einverstanden, dass C existiert, aber ich denke, dass Pythons Abhängigkeit von C äußerst nachteilig ist, und PyPy ist ein gutes Beispiel dafür, warum: Jetzt haben wir die Chance, schnelleres Python zu bekommen, aber wir sind durch jahrelanges Vertrauen in C gestolpert Es wäre viel besser für Python, auf eigenen Beinen zu stehen. Es ist sogar in Ordnung, wenn Python selbst in C geschrieben ist, aber das Problem ist die Existenz eines Erweiterungsmechanismus, der die Leute dazu ermutigt, Python auf eine Weise zu erweitern, die von C abhängt.
BrenBarn
4
Doppelkantenschwert - ein Teil dessen, was Python so beliebt gemacht hat, ist seine Fähigkeit, andere Anwendungen zu erweitern und durch andere Anwendungen erweitert zu werden. Wenn Sie das wegnehmen, würden wir wahrscheinlich nicht über Python sprechen.
Tritium21
10
@BrenBarn Es ist völlige Torheit zu behaupten, dass Pythons Abhängigkeit von C schädlich ist. Ohne die C-API von Python wären die meisten der wirklich leistungsstarken Bibliotheken und die großartige Interop, die Python in seinen prägenden Teenagerjahren (Ende der 90er Jahre) gewonnen hat, einschließlich des gesamten numerisch-wissenschaftlichen Ökosystems und der GUI-Schnittstellen, nicht möglich gewesen. Schauen Sie sich um, um einen Überblick über das gesamte Universum der Python-Anwendungen zu erhalten, bevor Sie solche pauschalen Aussagen machen.
Peter Wang
4
@PeterWang Alle diese Bibliotheken können in Python geschrieben werden, sie wären jedoch nicht so schnell wie sie sind. Was BrenBarn sagt, ist, dass wir jetzt die Chance haben, Python schnell genug zu machen, damit diese Bibliotheken in Python geschrieben werden können, aber wir lehnen es ab, diese Chance zu nutzen, weil es bedeutet, die Fähigkeit zu verlieren, die C-Bibliotheken zu verwenden. Ich glaube, das hat er mit nachteilig gemeint, nicht dass die Existenz von C-Bibliotheken eine schlechte Sache ist, sondern dass der einzige Weg, schnelle Bibliotheken zu
erstellen, die
14

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.

Eric Urban
quelle
1
PyPy verfügt über viele sorgfältig ausgeführte Benchmarks (im Gegensatz zu CPython, das derzeit keine benutzerorientierte Benchmark-Suite hat). Natürlich kann PyPy für den Netzwerkverkehr auf magische Weise nichts schneller machen.
Julian
1
Julian, es ist erwähnenswert, dass die PyPy-Leute seit Jahren große Anstrengungen unternehmen, um die Laufzeiten dieser speziellen Benchmark-Suite zu verbessern. Bis zu einem gewissen Grad scheinen sie ihre Optimierungen an diese Reihe von Benchmarks anzupassen, und meiner Erfahrung nach habe ich PyPy, abgesehen von rein numerischen Berechnungen (die in Fortran oder C99 sowieso besser sind), nie dazu gebracht, mehr zu sein als ~ 2X schneller als CPython.
Alex Rubinsteyn
9
@AlexRubinsteyn Aber die Ansicht derjenigen, die an PyPy arbeiten, war im Allgemeinen immer, dass wenn Sie einen Fall finden, in dem PyPy langsamer als CPython ist und Sie es in einen vernünftigen Benchmark verwandeln können, es eine gute Chance hat, der Suite hinzugefügt zu werden.
Gsnedders
1
Ich habe dein Blog überprüft. In Ihren Ergebnissen zeigt das einfache Python-Paar von (pickle, StringIO), dass pypy gegenüber cpython ~ 6,8x schneller ist. Ich denke, das ist ein nützliches Ergebnis. In Ihrer Schlussfolgerung weisen Sie (richtig) darauf hin, dass Pypy-Code (der einfach Python ist!) Langsamer ist als C-Code (cPickle, cStringIO), nicht Cpython-Code.
Caleb Hattingh
1
@gsnedders Ich habe einen Benchmark auf Basis angeboten rinohtype auf mehreren Gelegenheiten . Sie haben es noch nicht zur Suite hinzugefügt.
Brecht Machiels
12

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
Diese Antwort zitiert keine Benchmarks oder Referenzen.
qwr
7

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.)

pts
quelle
17
Es sollte betont werden, dass __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).
3
Der Overhead pro Objekt ist in CPython höher, was sehr wichtig ist, sobald Sie mit dem Erstellen vieler Objekte beginnen. Ich glaube, PyPy macht zum einen standardmäßig das Äquivalent von Slots .
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.

Stephan Eggermont
quelle
1
Wenn Ihr Projekt so einfach ist, spielt es natürlich keine Rolle, aber das Gleiche gilt für jede Implementierung einer beliebigen Sprache: Wenn Sie lediglich die Funktionen anderer Bibliotheken über relativ leistungsfähige ABIs aggregieren, ist alles irrelevant.
1
Es hat nichts mit einfach zu tun. In der Engineering-Zeit ist die Rückkopplungsschleife wichtig. Manchmal viel wichtiger als die Laufzeit.
Stephan Eggermont
1
Nun, Sie sprechen sehr vage (Engineering-Zeit ohne Bezug auf das, was entwickelt wird, was die Einschränkungen sind usw .; Rückkopplungsschleife ohne Bezug darauf, was an wen zurückgemeldet wird usw.), also gehe ich sich aus diesem Gespräch zurückzuziehen, anstatt kryptische Referenzen zu tauschen.
Hier ist nichts vage. Schauen Sie sich die OODA-Schleife oder PDCA an.
Stephan Eggermont
3
@user Nun, jedes Projekt, das einmal ausgeführt wird und dessen Ausführung einen Monat und eine Minute dauert, hat eine Gesamtgeschwindigkeit von 0,0% (1 Monat + 1 Minute gegenüber 1 Monat) gegenüber PyPy, selbst wenn PyPy tausendmal schneller wäre. Stephan behauptete nicht, dass alle Projekte eine Beschleunigung von 0% haben würden.
gmatht
4

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).

Yishen Chen
quelle
16
"Batterie enthalten" bedeutet große Standardbibliothek , AFAIK
Tshepang
4

Ich habe Beispiele gefunden, bei denen PyPy langsamer als Python ist. Aber: Nur unter Windows.

C:\Users\User>python -m timeit -n10 -s"from sympy import isprime" "isprime(2**521-1);isprime(2**1279-1)"
10 loops, best of 3: 294 msec per loop

C:\Users\User>pypy -m timeit -n10 -s"from sympy import isprime" "isprime(2**521-1);isprime(2**1279-1)"
10 loops, best of 3: 1.33 sec per loop

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):

from sympy import sieve
primes = list(sieve.primerange(1, 10**6))

Dies läuft auf PyPy 10 (!) Mal schneller als auf Python. Aber nicht an Fenstern. Dort ist es nur 3x so schnell.

lifolofi
quelle
Interessant! Weitere Vergleiche und Zahlen wären großartig gewesen.
ben26941
1

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 divisionfü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.

qwr
quelle
0

Unterstützte Python-Versionen

Um das Zen von Python zu zitieren :

Lesbarkeit zählt.

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.

Martin Thoma
quelle