Domanda

Google Open Source Blog :

  

PyPy è una reimplementazione di Python   in Python, utilizzando tecniche avanzate   per cercare di raggiungere una migliore performance   di CPython. Molti anni di duro lavoro   hanno finalmente dato i suoi frutti. La nostra velocità   risultati spesso battere CPython, vanno   dall'essere leggermente più lento, per   incrementi nella velocità di fino a 2x su Real   codice dell'applicazione, ad incrementi nella velocità di fino a   10x su piccoli punti di riferimento.

Come è possibile? Quale implementazione di Python è stato utilizzato per implementare PyPy? CPython ? E quali sono le probabilità di un PyPyPy o PyPyPyPy battere il loro punteggio?

(In una nota correlata ... perché qualcuno dovrebbe provare qualcosa di simile?)

È stato utile?

Soluzione

Q1. Come è possibile?

gestione manuale della memoria (che è quello che fa CPython con il suo conteggio) può essere più lenta della gestione automatica in alcuni casi.

Limitazioni nella realizzazione del CPython interprete alcune ottimizzazioni esclude che PyPy può fare (ad es. A grana fine serrature).

Come Marcelo accennato, il JIT. Essere in grado di confermare il volo il tipo di un oggetto è possibile salvare il bisogno di fare più dereferenziazioni di puntatori per arrivare infine al metodo che si desidera chiamare.

Q2. Quale implementazione di Python è stato utilizzato per implementare PyPy?

Il PyPy interprete è implementato in RPython che è un sottoinsieme tipizzazione statica di Python (la lingua e non l'interprete CPython). - Fare riferimento https://pypy.readthedocs.org/en/latest/architecture.html per i dettagli.

Q3. E quali sono le probabilità di un PyPyPy o PyPyPyPy battere il loro punteggio?

Questo dipenderebbe l'attuazione di questi ipotetici interpreti. Se uno di loro per esempio ha preso la fonte, ha fatto una sorta di analisi su di esso e convertito direttamente nel target specifico codice assembly stretto dopo l'esecuzione per un po ', immagino che sarebbe molto più veloce di CPython.

Aggiornamento: Di recente, su un cura artigianale ad esempio , PyPy sovraperformato un programma C simile compilato con gcc -O3. E 'un caso artificiosa, ma non esporre alcune idee.

Q4. Perché qualcuno dovrebbe provare qualcosa di simile?

Dal sito ufficiale. https://pypy.readthedocs.org/en/latest/architecture.html # mission-statement

  

Il nostro obiettivo è di fornire:

     
      
  • una traduzione comune e di un quadro di sostegno per la produzione di
      implementazioni di linguaggi dinamici, sottolineando un
    pulita   separazione tra specifica del linguaggio e l'attuazione
      aspetti. Noi chiamiamo questo il RPython toolchain _.

  •   
  • un'implementazione compatibile, flessibile e veloce del Python_   Lingua che utilizza la toolchain sopra per consentire nuova avanzata   -Alto livello dispone senza dover codificare il basso livello   i dettagli.

  •   
     

Separando le preoccupazioni in questo modo, la nostra implementazione di Python - e   altri linguaggi dinamici - è in grado di generare automaticamente un   compilatore Just-in-Time per qualsiasi linguaggio dinamico. Permette anche di un   mix-and-match approccio alle decisioni di attuazione, tra cui molti   che sono stati storicamente fuori del controllo di un utente, ad esempio   piattaforma di destinazione, modelli di memoria e di threading, raccolta dei rifiuti   strategie e ottimizzazioni applicate, compreso o meno   avere un JIT, in primo luogo.

Il compilatore C gcc è implementato in C, il compilatore Haskell GHC è scritto in Haskell. Avete qualche ragione per l'interprete Python / compilatore di non essere scritto in Python?

Altri suggerimenti

"PyPy è una reimplementazione di Python in Python" è un modo piuttosto fuorviante per descrivere PyPy, secondo me, anche se è tecnicamente vero.

Ci sono due parti principali di PyPy.

  1. Il quadro di traduzione
  2. L'interprete

Il quadro traduzione è un compilatore. Compila RPython il codice fino a C (o altri obiettivi), aggiungendo automaticamente in aspetti come la raccolta dei rifiuti e un compilatore JIT. E ' non possono Maniglia arbitraria di codice Python, solo RPython.

RPython è un sottoinsieme del normale Python; Codice tutto RPython è codice Python, ma non il contrario. Non esiste una definizione formale del RPython, perché RPython è fondamentalmente solo "il sottoinsieme di Python che può essere tradotto da quadro traduzione di PyPy". Ma per essere tradotto, il codice RPython deve essere staticamente tipizzato (i tipi sono desunti, non li dichiara, ma è ancora strettamente un tipo per ogni variabile), e non si può fare cose come dichiarando / funzioni di modifica / classi a runtime sia.

L'interprete, allora è un normale interprete Python scritto in RPython.

Poiché il codice RPython è normale codice Python, è possibile eseguirlo su qualsiasi interprete Python. Ma nessuno dei crediti di velocità di PyPy provengono da corsa in questo modo; questo è solo per un ciclo di prova rapida, perché tradurre l'interprete prende un molto di tempo.

Con questo capito, dovrebbe essere immediatamente evidente che le speculazioni circa PyPyPy o PyPyPyPy in realtà non hanno alcun senso. Si dispone di un interprete scritto in RPython. Si traduce in codice C che esegue Python rapidamente. C'è il processo si arresta; non più c'è RPython per accelerare elaborando nuovamente.

Quindi, "Come è possibile per PyPy essere più veloce di CPython" diventa anche abbastanza ovvio. PyPy ha una migliore attuazione, tra cui un compilatore JIT (è generalmente non è così veloce senza il compilatore JIT, io credo, il che significa PyPy è solo più veloce per i programmi suscettibili di compilazione JIT). CPython è mai stato progettato per essere un'implementazione altamente ottimizzazione del linguaggio Python (anche se provano a renderlo altamente Ottimizzato di attuazione, se si segue la differenza).


Il bit veramente innovativo del progetto PyPy è che non scrivono schemi GC sofisticati o compilatori JIT a mano. Scrivono l'interprete relativamente semplicemente in RPython, e per tutta RPython è livello inferiore rispetto a Python è ancora un garbage collection linguaggio orientato agli oggetti, molto più alto livello di C. Poi il quadro di traduzione automaticamente aggiunge le cose come GC e JIT. Così il sistema di traduzione è un enorme lo sforzo, ma si applica altrettanto bene a l'interprete Python PyPy però cambiano la loro attuazione, permettendo molta più libertà nella sperimentazione per migliorare le prestazioni (senza preoccuparsi di introdurre bug GC o l'aggiornamento del compilatore JIT per far fronte con le modifiche). Significa anche quando andare in giro a implementare un interprete python3, otterrà automaticamente gli stessi benefici. E tutti gli altri interpreti scritte con il quadro PyPy (di cui ci sono un certo numero a diversi stadi del polacco). E tutti gli interpreti che utilizzano il quadro PyPy supportano automaticamente tutte le piattaforme supportate dal quadro.

Quindi, il vero beneficio del progetto PyPy è quello di separare (quanto più possibile) tutte le parti di attuare un efficace interprete indipendente dalla piattaforma per un linguaggio dinamico. E poi venire con una buona implementazione di loro in un unico luogo, che può essere riutilizzato in molti interpreti. Questa non è una vittoria immediata come "le mie corse programma Python più veloce ora", ma è una grande prospettiva per il futuro.

E può eseguire il programma Python più veloce (forse).

PyPy è implementato in Python, ma implementa un compilatore JIT per generare codice nativo in tempo reale.

Il motivo per implementare PyPy in cima Python è probabilmente che si tratta semplicemente di un linguaggio molto produttiva, soprattutto perché il compilatore JIT rende le prestazioni della lingua del paese ospitante in qualche modo irrilevante.

PyPy è scritto in Python con restrizioni. Esso non viene eseguito sulla parte superiore del interprete CPython, per quanto ne so. Limitato Python è un sottoinsieme del linguaggio Python. Per quanto ne so, l'interprete PyPy viene compilato in codice macchina, in modo che quando installato non utilizza un interprete python in fase di esecuzione.

La tua domanda sembra aspettarsi la PyPy interprete è in esecuzione in cima CPython durante l'esecuzione del codice. Modifica Sì, per usare PyPy in primo luogo tradurre il codice Python PyPy, sia per C e costruire con gcc, a bytecode JVM, o per il codice .Net CLI. Vedi href="http://codespeak.net/pypy/trunk/pypy/doc/getting-started-python.html" Operazioni preliminari

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top