798 Stimmen

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

Ich habe viel über das PyPy-Projekt gehört. Sie behaupten, dass es 6,3-mal schneller ist als der CPython-Interpreter auf ihrer Webseite.

Immer wenn wir über dynamische Sprachen wie Python sprechen, ist Geschwindigkeit eines der Hauptprobleme. Um dieses Problem zu lösen, sagen sie, dass PyPy 6,3-mal schneller ist.

Das zweite Problem ist Parallelität, der berüchtigte Global Interpreter Lock (GIL). Dafür sagt PyPy, dass es ein GIL-freies Python bieten kann.

Wenn PyPy diese großen Herausforderungen lösen kann, was sind seine Schwächen, die eine breitere Nutzung verhindern? Das heißt, was hindert jemanden wie mich, einen typischen Python-Entwickler, davon ab, jetzt zu PyPy zu wechseln?

723voto

Veedrac Punkte 54089

HINWEIS: PyPy ist jetzt reifer und besser unterstützt als 2013, als diese Frage gestellt wurde. Vermeiden Sie also den Schluss aus veralteten Informationen.


  1. Wie andere bereits schnell erwähnt haben, hat PyPy eine vage Unterstützung für C-Erweiterungen. Es gibt Unterstützung, aber normalerweise langsamer als Python und es ist bestenfalls unsicher. Daher erfordern viele Module einfach CPython. Überprüfen Sie die Liste der unterstützten Pakete, aber beachten Sie das Datum, an dem diese Liste aktualisiert wurde, denn sie wird nicht synchron mit der tatsächlichen Unterstützung gehalten, daher ist es immer noch möglich, dass Pakete, die auf dieser Liste als nicht unterstützt gekennzeichnet sind, tatsächlich unterstützt werden.
  2. Die Unterstützung von Python hinkt typischerweise ein paar Versionen hinterher, sodass Sie, wenn Sie unbedingt die neuesten Funktionen benötigen, möglicherweise eine Weile warten müssen, bis PyPy diese unterstützt.
  3. PyPy ist manchmal tatsächlich nicht schneller für "Skripte", die viele Leute in Python verwenden. Dies sind die kurz laufenden Programme, die etwas Einfaches und Kleines tun. Da PyPy ein JIT-Compiler ist, kommen seine Hauptvorteile aus langen Laufzeiten und einfachen Typen (wie Zahlen). Die Vor-JIT-Geschwindigkeiten von PyPy können im Vergleich zu CPython schlecht sein.
  4. Trägheit. Der Umstieg auf PyPy erfordert oft Umrüstungen, was für einige Personen und Organisationen schlichtweg zu viel Arbeit bedeutet.

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

114voto

spookylukey Punkte 6114

Diese Seite behauptet nicht, dass PyPy 6,3 Mal schneller ist als CPython. Um es zu zitieren:

Der geometrische Durchschnitt aller Benchmarks beträgt 0,16 oder 6,3 Mal schneller als CPython

Das ist eine sehr unterschiedliche Aussage im Vergleich zu der Pauschalaussage, die Sie gemacht haben, und wenn Sie den Unterschied verstehen, werden Sie zumindest einen Grund verstehen, warum Sie nicht einfach sagen können "verwenden Sie PyPy". Es mag so klingen, als würde ich Haare spalten, aber zu verstehen, warum diese beiden Aussagen völlig unterschiedlich sind, ist entscheidend.

Um das aufzuschlüsseln:

  • Die von ihnen gemachte Aussage gilt nur für die von ihnen verwendeten Benchmarks. Sie sagt absolut nichts über Ihr Programm aus (es sei denn, Ihr Programm ist genau dasselbe wie einer ihrer Benchmarks).

  • Die Aussage bezieht sich auf einen Durchschnitt einer Gruppe von Benchmarks. Es wird nicht behauptet, dass die Ausführung von PyPy selbst für die von ihnen getesteten Programme eine 6,3-fache Verbesserung bringt.

  • Es wird nicht behauptet, dass PyPy überhaupt alle Programme ausführen wird, die CPython überhaupt ausführt, geschweige denn schneller.

90voto

Tritium21 Punkte 2786

Weil pypy nicht zu 100% kompatibel ist, 8 GB RAM zum Kompilieren benötigt, ein bewegliches Ziel ist und sehr experimentell, während cpython stabil ist, das Standardziel für Modul-Builder seit 2 Jahrzehnten (einschließlich c-Erweiterungen, die auf pypy nicht funktionieren), und bereits weit verbreitet ist.

Pypy wird wahrscheinlich nie die Referenzimplementierung sein, aber es ist ein gutes Werkzeug zu haben.

41voto

BrenBarn Punkte 228691

Die zweite Frage ist einfacher zu beantworten: Sie können PyPy im Grunde genommen als Plug-and-Play-Ersatz verwenden, wenn Ihr gesamter Code reines Python ist. Allerdings sind viele weit verbreitete Bibliotheken (einschließlich einiger der Standardbibliothek) in C geschrieben und als Python-Erweiterungen kompiliert. Einige davon können mit PyPy zum Laufen gebracht werden, andere nicht. PyPy bietet dasselbe "nach vorne gerichtete" Tool wie Python --- das heißt, es ist Python --- aber seine inneren Werte sind anders, daher funktionieren Tools, die mit diesen inneren Werten interagieren, nicht.

Was die erste Frage betrifft, stelle ich mir vor, dass es eine Art Catch-22 mit der ersten ist: PyPy hat sich rasch weiterentwickelt, um die Geschwindigkeit zu verbessern und die Interoperabilität mit anderem Code zu verbessern. Dies hat es experimenteller gemacht als offiziell.

Ich denke, es ist möglich, dass PyPy, wenn es einen stabilen Zustand erreicht, breiter eingesetzt wird. Ich denke auch, es wäre großartig, wenn Python sich von seinen C-Grundlagen entfernen würde. Aber das wird eine Weile dauern. PyPy hat noch nicht die kritische Masse erreicht, in der es fast allein genug nützlich ist, um alles zu tun, was man möchte, was die Leute dazu motivieren würde, die Lücken zu füllen.

15voto

Eric Urban Punkte 3661

Ich habe einen kleinen Benchmark zu diesem Thema gemacht. Während viele der anderen Poster gute Punkte zur Kompatibilität gemacht haben, war meine Erfahrung, dass PyPy nicht viel schneller ist, wenn es nur darum geht, Bits zu verschieben. Für viele Anwendungen von Python dient es hauptsächlich dazu, Bits zwischen zwei oder mehr Diensten zu übersetzen. Zum Beispiel führen nicht viele Webanwendungen eine CPU-intensiven 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.

Der BDFL und die CPython-Entwickler sind eine bemerkenswert intelligente Gruppe von Menschen und haben es geschafft, CPython in einem solchen Szenario hervorragend zu unterstützen. Hier ist ein schamloser Blog-Stecker: http://www.hydrogen18.com/blog/unpickling-buffers.html. Ich verwende Stackless, das von CPython abgeleitet ist und die volle C-Modulschnittstelle beibehält. In diesem Fall habe ich keinen Vorteil darin gefunden, PyPy zu verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X