Perché Python non è stato ottimizzato come le moderne implementazioni Javascript?


11

Le moderne implementazioni Javascript come V8 (Chrome), SpiderMonkey (Firefox) e Chakra (IE / Edge) hanno tutte la compilazione JIT e una serie di altre ottimizzazioni per migliorare le prestazioni.

Perché Python non li ha?

Ho osservato PyPy e IronPython, che entrambi rivendicano guadagni di velocità. PyPy Non capisco come un'implementazione di Python scritta in Python, un linguaggio interpretato, sarà più veloce dell'implementazione di riferimento in C. IronPython, stessa idea, ma non vedo come .NET Framework aumenterà la velocità.


2
IronPython - come qualsiasi altro linguaggio .NET - è compilato nel "Common Intermediate Language" di Microsoft per il quale esistono implementazioni di compilatori JIT molto mature.
Doc Brown,

2
Un linguaggio di programmazione è una specifica (scritta in alcuni documenti), non un software. Solo le implementazioni del linguaggio di programmazione sono software (e possono essere compilatori o interpreti).
Basile Starynkevitch il

1
@BasileStarynkevitch: non capisco cosa stai cercando di dirci con questo commento. L'OP chiede esplicitamente informazioni su CPython, PyPy e IronPython, che sono implementazioni specifiche di Python.
Doc Brown,

1
@DocBrown Sembra un punto rilevante da sollevare, dato l'ultimo paragrafo della domanda, che mostra un malinteso quando chiama specificamente Python un linguaggio interpretato.
8

Risposte:


19

Perché Python non li ha?

Non sono sicuro del motivo per cui pensi che non ci siano implementazioni Python che si preoccupano delle prestazioni. PyPy , IronPython e Jython sono tutte implementazioni Python di livello industriale, pronte per la produzione e attente alle prestazioni. Pyston è un'implementazione in fase di sviluppo creata appositamente per le prestazioni. Unladen Swallow e Psyco erano anche progetti per migliorare le prestazioni di Python.

Tuttavia, il fatto che gli utenti di CPython superino di gran lunga la base totale di utenti combinati di tutte le altre implementazioni, che Unladen Swallow sia stata respinta dalla comunità, che la maggior parte di questi progetti siano morti o che lottano per attirare gli sviluppatori dovrebbe dirti qualcosa su come Python la comunità valorizza le prestazioni.

Questa risposta è un buon esempio della mentalità tipica della comunità Python: invece di risolvere i problemi di prestazioni, preferirebbero semplicemente scrivere il loro codice non in Python.

Ho osservato PyPy e IronPython, che entrambi rivendicano guadagni di velocità. PyPy Non capisco come un'implementazione di Python scritta in Python, un linguaggio interpretato, sarà più veloce dell'implementazione di riferimento in C.

Prima di tutto: non importa in quale lingua è scritto il compilatore. Dopo tutto, il compilatore viene eseguito solo una volta , quindi anche se fosse lento, non importa: le prestazioni del compilatore sono irrilevanti, ciò che è rilevante è la prestazione dell'output del compilatore.

In secondo luogo, dal momento importa solo quanto velocemente l'uscita del compilatore è, e il compilatore è scritto in Python, cioè il linguaggio che si compila, si può effettivamente fare per sé veloce compilando sé.

In terzo luogo, non esiste un "linguaggio interpretato". Una lingua è un insieme di regole e restrizioni matematiche. È una specifica. Un pezzo di carta. Una lingua non è compilata o interpretata. Una lingua è solo . Compilazione e interpretazione sono tratti di un'implementazione del linguaggio , più precisamente un compilatore o interprete (duh!), Non il linguaggio. Ogni lingua può essere implementata da un compilatore. Ogni lingua può essere implementata da un interprete. È possibile generare meccanicamente un compilatore da un interprete e un interprete da un compilatore.

Ma tutto ciò non ha davvero importanza, perché PyPy in realtà non è scritto in Python. E 'scritto in RPython . RPython è composto da due parti, il linguaggio di programmazione RPython e il framework RPython.

Il linguaggio di programmazione RPython non è Python. È un linguaggio di programmazione diverso. RPython è un linguaggio di programmazione tipicamente statico, all'incirca allo stesso livello di astrazione di Java, con circa le stesse prestazioni di C. RPython è un sottoinsieme sintattico e semantico di Python, il che significa che ogni programma RPython è un programma Python valido e può essere gestito da un'implementazione di Python (anche se in genere più ordini di grandezza più lenti, ma questo è ancora utile per il debug perché hai accesso a tutti gli strumenti di Python e l'interpretazione inizia subito, mentre la compilazione dell'implementazione del linguaggio richiede in genere circa 5-10 minuti ), ma non è vero il contrario.

Il framework RPython è un framework per la scrittura di implementazioni di linguaggio dinamico ad alte prestazioni nel linguaggio di programmazione RPython. Include un garbage collector, spazio oggetti, protocollo meta-oggetto, oggetti predefiniti, tipi e operazioni e così via. Ma il gioiello della corona è la sua capacità di generare automaticamente un compilatore JIT da un interprete: se implementate un linguaggio nel framework RPython, dovete solo scrivere un interprete, il framework RPython si prende cura del JIT.

Ci sono molte implementazioni linguistiche sulla piattaforma RPython , non solo PyPy.

IronPython, stessa idea ma non vedo come .NET Framework aumenterà la velocità.

La maggior parte delle implementazioni della CLI ISO, come le varie varianti .NET di Microsoft o Mono, contengono sofisticati raccoglitori di rifiuti, ottimizzatori e compilatori. Lo stesso vale per le implementazioni Jython e Java.

IronPython è un compilatore, compila il codice sorgente Python negli alberi DLR (DLR è il Dynamic Language Runtime), che vengono quindi ulteriormente compilati nel codice byte CIL, che viene quindi di nuovo tipicamente ulteriormente compilato nel codice macchina nativo.


6

Le moderne implementazioni Javascript come V8 (Chrome), SpiderMonkey (Firefox) e Chakra (IE / Edge) hanno tutte la compilazione JIT e una serie di altre ottimizzazioni per migliorare le prestazioni.

Perché Python non li ha?

JavaScript è incluso nei browser Web e oggi una notevole quantità di software è progettata per essere eseguita nei browser Web. Ciò rende le prestazioni di JavaScript molto importanti, facendo sì che aziende come Google, Apple e Microsoft investano molte risorse per velocizzare i tempi di esecuzione di JavaScript. Se questo flusso di denaro fosse stato reindirizzato su Python, sarebbe stato altrettanto veloce.

PyPy Non capisco come un'implementazione di Python scritta in Python, un linguaggio interpretato, sarà più veloce dell'implementazione di riferimento in C.

L'idea è che una volta che il codice è JIT, non viene più "interpretato". PyPI funziona trasformando il codice Python in codice macchina (ad es. Codice macchina x86_64) che viene quindi eseguito direttamente sul processore.


3
Particolarmente rilevante è che, nel browser Web, non esiste alternativa a JavaScript (o almeno, in genere non è ancora disponibile su tutti i principali browser). Se vuoi prestazioni veloci nel browser web, devi avere un'implementazione JavaScript veloce. Considerando che su piattaforme che eseguono Python, puoi quasi sicuramente passare a un'altra lingua che potrebbe avere un'implementazione con prestazioni migliori.
8

-3

Se strutturi il tuo codice Python in moduli con un semplice avvio di primo livello come file python principale, (con pochissimo codice al suo interno), allora Python compila tutto il resto del tuo codice in codice byte indipendente dalla macchina, questi sono i File .pyc visualizzati nella struttura della directory. Ciò riduce al minimo i tempi di caricamento e interpretazione dopo la prima esecuzione.

Se avvii lo script con i flag -O o -OO o imposti PYTHONOPTIMIZE su un valore maggiore di 0, vengono generati file .pyo che sono ulteriormente ottimizzati.

Se hai bisogno di un'elevata ottimizzazione per alcune funzioni specifiche, puoi scriverle in C, C ++, FORTRAN o GO e poi usarle da Python.


Come si integrano le estensioni non C in Python? Sono a conoscenza solo delle estensioni C per Cython.

1
@Bey: fondamentalmente qualsiasi cosa in una libreria condivisa, (.dll o .so), può essere chiamata da Python purché si conoscano le firme delle funzioni - queste possono essere configurate manualmente, generate da strumenti come swing o persino generate dalla documentazione di doxygen. stackoverflow.com/questions/5811949/… è utile come blog.heroku.com/see_python_see_python_go_go_python_go
Steve Barnes,
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.