Perché PyPy non è stato incluso in Python standard?


165

Stavo guardando PyPy e mi chiedevo solo perché non è stato adottato nelle principali distribuzioni di Python. Cose come la compilazione JIT e il footprint di memoria inferiore non migliorerebbero notevolmente le velocità di tutto il codice Python?

In breve, quali sono gli svantaggi principali di PyPy che gli fanno rimanere un progetto separato?


4
Inoltre, pypy non ha ancora supporto per numpy. morepypy.blogspot.ch/2012/09/numpy-on-pypy-status-update.html
rthiago

E il supporto intorpidito graffia solo la superficie di ciò che le applicazioni di informatica scientifica avrebbero bisogno prima di passare a PyPy. Ecco alcuni pensieri convincenti dell'autore originale intontito: technicaldiscovery.blogspot.com/2011/10/…
Stuart Berg

3
Penso che queste risposte e questi commenti siano obsoleti
Marlon Abeykoon,

Risposte:


249

PyPy non è un fork di CPython, quindi non può mai essere unito direttamente in CPython.

Teoricamente la comunità di Python potrebbe adottare universalmente PyPy, PyPy potrebbe essere implementata come riferimento e CPython potrebbe essere interrotto. Tuttavia, PyPy ha i suoi punti deboli:

  • CPython è facile da integrare con i moduli Python scritti in C, che è tradizionalmente il modo in cui le applicazioni Python hanno gestito attività ad alta intensità di CPU (vedi ad esempio il progetto SciPy).
  • La fase della compilazione PyPy JIT stessa costa tempo CPU - è solo attraverso l'esecuzione ripetuta del codice compilato che diventa complessivamente più veloce. Ciò significa che i tempi di avvio possono essere più alti, e quindi PyPy non è necessariamente efficiente per l'esecuzione di codice colla o script banali.
  • Il comportamento di PyPy e CPython non è identico sotto tutti gli aspetti, specialmente quando si tratta di "dettagli di implementazione" (comportamento che non è specificato dal linguaggio ma è ancora importante a livello pratico).
  • CPython funziona su più architetture di PyPy ed è stato adattato con successo per funzionare in architetture incorporate in modi che potrebbero non essere pratici per PyPy.
  • Lo schema di conteggio dei riferimenti di CPython per la gestione della memoria ha probabilmente un impatto sulle prestazioni più prevedibile rispetto ai vari sistemi GC di PyPy, sebbene ciò non sia necessariamente vero per tutte le strategie "pure GC".
  • PyPy non supporta ancora completamente Python 3.x, sebbene si tratti di un elemento di lavoro attivo.

PyPy è un ottimo progetto, ma la velocità di runtime su attività ad alta intensità di CPU non è tutto, e in molte applicazioni è l'ultima delle tante preoccupazioni. Ad esempio, Django può essere eseguito su PyPy e questo rende il templating più veloce, ma i driver di database di CPython sono più veloci di PyPy; alla fine, quale implementazione è più efficiente dipende da dove si trova il collo di bottiglia in una determinata applicazione.

Un altro esempio: penseresti che PyPy sarebbe ottimo per i giochi, ma la maggior parte delle strategie GC come quelle usate in PyPy causano un notevole jitter. Per CPython, la maggior parte delle cose di gioco ad alta intensità di CPU viene scaricata nella libreria PyGame, di cui PyPy non può trarre vantaggio poiché PyGame è implementato principalmente come estensione C (anche se vedi: pygame-cffi). Penso ancora che PyPy possa essere un'ottima piattaforma per i giochi, ma non l'ho mai visto effettivamente utilizzato.

PyPy e CPython hanno approcci radicalmente diversi alle domande fondamentali di progettazione e fanno diversi compromessi, quindi nessuno dei due è "migliore" dell'altro in ogni caso.


4
Non è vero che PyPy non è adatto per l'esecuzione di script. Il suo tempo di avvio è praticamente lo stesso di CPython e la sua velocità di interpretazione è simile.
Lucian,

6
Vale la pena notare che PyPy ora viene fornito con un GC incrementale ed è potenzialmente più adatto ai giochi di conseguenza.
porgarmingduod,

63

Per uno, non è compatibile al 100% con Python 2.x e ha solo il supporto preliminare per 3.x.

Inoltre non è qualcosa che potrebbe essere unito - L'implementazione di Python fornita da PyPy è generata usando un framework che hanno creato, che è estremamente interessante, ma anche completamente diverso dall'implementazione CPython esistente. Dovrebbe essere una sostituzione completa.

Ci sono alcune differenze molto concrete tra PyPy e CPython, una grande è il modo in cui sono supportati i moduli di estensione - che, se si vuole andare oltre la libreria standard, è un grosso problema.

Vale anche la pena notare che PyPy non è universalmente più veloce.


54

Guarda questo video di Guido van Rossum . Parla della stessa domanda che hai posto a 12 min 33 secondi.

Punti salienti:

  • mancanza di compatibilità con Python 3
  • mancanza di supporto per l'estensione
  • non appropriato come codice colla
  • la velocità non è tutto

Dopo tutto, è lui a decidere ...


3
+1 per il collegamento CON collegamento diretto alla parte pertinente del video! Anche +1 per il sondaggio informale di Guido van Rossum esilarantemente veritiero "Quante persone usano PyPy in produzione? ... niente mani? Tossisce Bene, immagino che ci sia ancora speranza [per CPython]."
Trevor Boyd Smith,

15

Un motivo potrebbe essere che, secondo il sito PyPy , attualmente funziona solo su architettura Intel x86 a 32 e 64 bit, mentre CPython funziona anche su altre piattaforme. Ciò è probabilmente dovuto ai miglioramenti della velocità specifici della piattaforma in PyPy. Mentre la velocità è una buona cosa, le persone spesso vogliono che le implementazioni del linguaggio siano il più "indipendenti dalla piattaforma" possibile.


6
Si noti che un backend ARM è "quasi presente" e un backend PowerPC è WIP. Si noti inoltre che questo si riferisce solo al compilatore JIT e il porting di JIT su una nuova architettura richiede semplicemente l'implementazione di un generatore di codice per un IR relativamente semplice e di basso livello, niente di più.

1
A partire dal 2018, PyPy ora funziona su più architetture x86 (32/64 bit su Linunx, Windows, MacOS e BSD), ma anche su Linux, hardware ARM più recente (ARMv6 o ARMv7, con VFPv3), big- e little-endian varianti di PPC64 e s390x.
Frédéric Grosshans,

7

Consiglio di guardare questo keynote di David Beazley per ulteriori approfondimenti. Risponde alla tua domanda dando chiarezza sulla natura e la complessità di PyPy.


6

Oltre a tutto ciò che è stato detto qui, PyPy non è così solido come CPython in termini di bug. Con SymPy, abbiamo trovato circa una dozzina di bug in PyPy negli ultimi due anni, sia nelle versioni rilasciate che nei nightly.

D'altra parte, abbiamo mai trovato un solo bug in CPython, ed era in fase di rilascio.

Inoltre, non scartare la mancanza del supporto di Python 3. Nessuno nella community principale di Python si preoccupa più di Python 2. Stanno lavorando alle prossime grandi cose in Python 3.4, che sarà la quinta uscita principale di Python 3. I ragazzi di PyPy non ne hanno ancora ottenuto uno. Quindi hanno qualcosa da recuperare prima di poter iniziare a essere contendenti.

Non fraintendetemi. PyPy è fantastico. Ma è ancora lungi dall'essere migliore di CPython in molti modi molto importanti.

E a proposito, se usi SymPy in PyPy, non vedrai un footprint di memoria più piccolo (o neanche uno speedup). Vedi https://bitbucket.org/pypy/pypy/issues/1447/ .


2
A partire dal 2018, posso confermare di aver visto accelerazioni di circa un ordine di grandezza in diversi usi di sympy
Frédéric Grosshans

1
@ FrédéricGrosshans interessante. Dovrò provare di nuovo a confrontarlo.
asmeurer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.