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

7

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 ha questi?

Ho guardato PyPy e IronPython, che entrambi sostengono guadagni di velocità. PyPy Non capisco come un'implementazione 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à.

    
posta Jay 27.04.2017 - 07:21
fonte

3 risposte

16

Why doesn't Python have these?

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

Tuttavia, il fatto che gli utenti di CPython superino di gran lunga la base di utenti totale combinata di tutte le altre implementazioni, che Unladen Swallow è stato rifiutato dalla comunità, che la maggior parte di questi progetti sono morti o in difficoltà attirare gli sviluppatori dovrebbe dirti qualcosa su come la comunità di Python apprezza 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.

I have been looking at PyPy and IronPython, which both claim speed gains. PyPy I don't understand how a Python implementation written in Python, an interpreted language, will be faster than the reference implementation 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 era lento, non importa: le prestazioni del compilatore sono irrilevanti, ciò che è rilevante è la performance del output del compilatore.

In secondo luogo, poiché importa solo quanto sia veloce l' output del compilatore, e il compilatore sia scritto in Python, cioè il linguaggio che compila, può effettivamente fare se stesso veloce compilando se stesso.

In terzo luogo, non esiste una "lingua interpretata". Una lingua è un insieme di regole e restrizioni matematiche. È una specifica Un pezzo di carta. Una lingua non è compilata o interpretata. Una lingua è . La compilazione e l'interpretazione sono tratti di una lingua implementazione , più precisamente, un compilatore o interprete (duh!), Non la lingua. Ogni linguaggio può essere implementato 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 realmente importanza, perché PyPy è in realtà non scritto in Python. È scritto in RPython . RPython è costituito 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 staticamente tipizzato, grosso modo sullo stesso livello dell'astrazione come Java, con circa le stesse prestazioni di C. RPython è un sottoinsieme sintattico e semantico di Python, il che significa che ogni programma RPython è un valido programma Python e può essere eseguito da un'implementazione Python (anche se in genere diversi ordini di grandezza più lenti, ma questo è ancora utile per il debug perché si ha accesso a tutti gli strumenti di Python e l'interpretazione inizia immediatamente, mentre la compilazione dell'implementazione del linguaggio richiede in genere circa 5-10 minuti ), ma il contrario non è vero.

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

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

IronPython, same idea but I don't see how the .NET Framework will increase speed.

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

IronPython è un compilatore, compila il codice sorgente Python per gli alberi DLR (DLR è il Dynamic Language Runtime), che viene poi ulteriormente compilato in codice byte CIL, che viene quindi di nuovo ulteriormente compilato in codice macchina nativo.

    
risposta data 27.04.2017 - 10:28
fonte
5

Modern Javascript implementations like V8 (Chrome), SpiderMonkey (Firefox), and Chakra (IE/Edge) all have JIT compilation, and a number of other optimizations to improve performance.

Why doesn't Python have these?

JavaScript è incluso nei browser Web e una notevole quantità di software oggi è progettata per essere eseguita nei browser web. Ciò rende le prestazioni di JavaScript molto importanti, e aziende come Google, Apple e Microsoft investono molte risorse per velocizzare i runtime dei JavaScript. Se questo flusso di denaro fosse stato reindirizzato a Python, sarebbe altrettanto veloce.

PyPy I don't understand how a Python implementation written in Python, an interpreted language, will be faster than the reference implementation in C.

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

    
risposta data 27.04.2017 - 07:46
fonte
-3

Se si struttura il codice Python in moduli con un semplice avvio di primo livello come file python principale (con un codice molto piccolo), python compila tutto il resto del codice in un codice byte indipendente dalla macchina, questi sono i file .pyc che vedi nella struttura della tua directory. Ciò minimizza i tempi di caricamento e di interpretazione dopo la prima esecuzione.

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

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

    
risposta data 27.04.2017 - 09:18
fonte

Leggi altre domande sui tag