Python è più veloce e leggero di C ++? [chiuso]


90

Ho sempre pensato che i vantaggi di Python siano la leggibilità del codice e la velocità di sviluppo, ma il tempo e l'utilizzo della memoria non erano buoni come quelli di C ++.

Queste statistiche mi hanno colpito molto duramente.

Cosa ti dice la tua esperienza sul tempo e sull'utilizzo della memoria tra Python e C ++?


18
Quindi Pyhton è per la maggior parte di questi casi più lento e utilizza più RAM ma la sorgente è più piccola. Qual è esattamente il problema?
nuriaion

2
Immagino di aver interpretato male i risultati.
Alex

6
La cosa veramente interessante è che i test C ++ sono ancora "migliori" di quelli C!
gbjbaanb

9
@gbjbaanb: non mi sorprende. C ++ ha aggiunto molte funzionalità che abilitano codice potenzialmente più veloce. Se sai cosa stai facendo, C ++ può essere incredibilmente efficiente, più di C. (Ovviamente, C ++ include anche alcune funzionalità che danneggiano le prestazioni, ma non devi usarle). Ma la credenza comune che "C è più veloce di C ++" è sbagliata. (e la domanda non è molto significativa in primo luogo)
jalf

1
Il collegamento è morto
Arn

Risposte:


237

Penso che tu stia leggendo queste statistiche in modo errato. Mostrano che Python è fino a circa 400 volte più lento di C ++ e con l'eccezione di un singolo caso, Python è più un divoratore di memoria. Tuttavia, quando si tratta della dimensione del codice sorgente, Python vince.

Le mie esperienze con Python mostrano la stessa tendenza definita secondo cui Python è nell'ordine da 10 a 100 volte più lento di C ++ quando esegue qualsiasi serio calcolo dei numeri. Ci sono molte ragioni per questo, le principali sono: a) Python è interpretato, mentre C ++ è compilato; b) Python non ha primitive, tutto, inclusi i tipi incorporati (int, float, ecc.) sono oggetti; c) un elenco Python può contenere oggetti di tipo diverso, quindi ogni voce deve memorizzare dati aggiuntivi sul suo tipo. Tutto ciò ostacola gravemente sia il runtime che il consumo di memoria.

Questo non è un motivo per ignorare Python. Un sacco di software non richiede molto tempo o memoria anche con il fattore 100 di lentezza temporale. Il costo di sviluppo è dove Python vince con lo stile semplice e conciso. Questo miglioramento del costo di sviluppo spesso supera il costo di risorse aggiuntive di CPU e memoria. Quando non lo fa, tuttavia, vince il C ++.


108
Inoltre, le persone che parlano del fatto che Python sia lento per lo scricchiolio serio dei numeri non hanno usato i moduli Numpy e Scipy. Python sta davvero decollando nell'informatica scientifica in questi giorni. Ovviamente, la velocità deriva dall'utilizzo di moduli scritti in C o librerie scritte in Fortran, ma questa è la bellezza di un linguaggio di scripting secondo me.
Justin Peel

3
Mi assicuro cosa hai detto e questo è un link per dimostrarlo: blog.dhananjaynene.com/2008/07/…
ucefkh

2
Riguardo a: c) un elenco Python può contenere oggetti di tipo diverso, quindi ogni voce deve memorizzare dati aggiuntivi sul suo tipo. L'elenco di python è in realtà un elenco di puntatori a oggetti. In python è il valore che conosce il suo tipo, mentre la variabile è solo un puntatore all '"oggetto valore generico" (quindi anche i numeri sono immutabili). Quindi gli elenchi non memorizzano i tipi di contenuti, ma solo i puntatori. Tuttavia, hai ragione sul sovraccarico della memoria: python deve memorizzare il tipo e altro contesto per valori di qualsiasi tipo.
Alex

se parli di cpython ... allora sì, ma pypy è nella maggior parte dei casi molto veloce (paragonabile a java, 1/3 di velocità di java immagino), i sottoinsiemi di python sono quasi veloci quanto c ++ (vedi shedskin)
Quonux

1
@JustinPeel mi chiedo se sia vero. anche quando si fa un uso estensivo di numpye scipy, pythonè probabile che una grande base di codice abbia molto codice in puro python, rendendo le cose più lente di C++. uno script python si avvicina alla velocità di uno C++script man mano che Carriva la percentuale del suo codice 100, a quel punto non è più uno script python. python sta decollando, di sicuro, ma non perché sia ​​veloce quanto C++- perché è più facile da usare.
dbliss

132

Tutti gli utilizzi più lenti (> 100x) di Python durante la sparatoria sono operazioni scientifiche che richiedono un elevato numero di GFlop / s. NON dovresti usare python per quelli comunque. Il modo corretto di usare python è importare un modulo che esegue quei calcoli e poi passare un pomeriggio rilassante con la tua famiglia. Questo è il modo pitonico :)


3
Al giorno d'oggi ci sono diversi compilatori da Python a C ++ , quindi in alcuni casi Python può essere veloce come C ++.
Anderson Green

26

La mia esperienza è la stessa dei benchmark. Python può essere lento e utilizza più memoria. Scrivo molto, molto meno codice e funziona la prima volta con molto meno debugging. Dal momento che gestisce la memoria per me, non devo fare alcuna gestione della memoria, risparmiando ore di inseguimento di perdite di core.

Qual'è la tua domanda?


Ero solo confuso dai risultati dei benchmark. Si scopre che li ho interpretati male.
Alex

16

La dimensione della sorgente non è una cosa sensata da misurare. Ad esempio, il seguente script di shell:

cat foobar

è molto più breve dei suoi equivalenti Python o C ++.


35
E molto più facile da mantenere che anche le versioni più lunghe di Python o C ++. Io sostengo che la dimensione del codice sorgente sia importante, e per alcuni compiti semplici, gli script di shell concisi sono buoni.
S.Lott

Credo anche che la dimensione del codice sorgente sia molto importante e per alcune attività Bash è lo strumento giusto per il lavoro. Guarda un bell'esempio di confronto di un semplice script bash con python qui: innolitics.com/articles/programming-languages/… (devi scorrere un po 'verso il basso). Penso che sia un esempio leggermente più sofisticato di cat footer.
jdg

7

Inoltre: Psyco vs. C ++ .

È ancora un pessimo confronto, dal momento che nessuno farebbe il numero eccessivo di benchmark su cui i benchmark tendono comunque a concentrarsi in puro Python. Uno migliore sarebbe confrontare le prestazioni di applicazioni realistiche, o C ++ rispetto a NumPy, per avere un'idea se il tuo programma sarà notevolmente più lento.


2
in altre parole - dal momento che numbercrunchy è molto più lento, scrivilo in C ++ e chiamalo da Python :-)
igouy

1
Se hai intenzione di utilizzare una libreria in python per renderlo più veloce, potresti anche utilizzare una libreria per lo scricchiolio dei numeri in c ++. In questo modo mantieni la flessibilità di c ++ senza dover scrivere un mucchio di codice :)
SuperSim135

Questo è un inutile necro di livello divino . OP afferma letteralmente di preferire Python per leggibilità e comodità, perché qualcuno dovrebbe usare direttamente un linguaggio che gli piace di meno, quando possono ottenere la maggior parte dei vantaggi in termini di prestazioni avendo gli autori di librerie che si occupano di quelli per lui? Il punto di utilizzare le librerie non è dover fare il tipo di lavoro che fanno meglio da soli, che una libreria sembra essere un legame nativo è un dettaglio di ottimizzazione / implementazione.
millimoose

6

Il problema qui è che hai due linguaggi diversi che risolvono due problemi diversi ... è come confrontare C ++ con assembler.

Python è per lo sviluppo rapido di applicazioni e per quando le prestazioni sono un problema minimo.

C ++ non è per lo sviluppo rapido di applicazioni ed eredita un'eredità di velocità da C - per la programmazione di basso livello.


3

È lo stesso problema di sempre con il linguaggio di programmazione gestito e facile da usare: sono lenti (e talvolta mangiano memoria).

Questi sono linguaggi per controllare piuttosto che elaborare. Se dovessi scrivere un'applicazione per trasformare le immagini e dovessi usare anche Python, tutta l'elaborazione potrebbe essere scritta in C ++ e collegata a Python tramite binding mentre l'interfaccia e il controllo del processo sarebbero sicuramente Python.


Quelle librerie sono già scritte per Python o C o Java, quindi perché non utilizzare un linguaggio dinamico per incollarle insieme?
aoeu256

2

Penso che queste statistiche dimostrino che Python è molto più lento e utilizza più memoria per quei benchmark: sei sicuro di leggerli nel modo giusto?

Nella mia esperienza, che riguarda principalmente la scrittura di programmi legati alla rete e al file system in Python, Python non è significativamente più lento in alcun modo. Per quel tipo di lavoro, i suoi benefici superano i costi.


Infatti. Quando le prestazioni sono un problema, ciò in cui Python è bravo è associare moduli esterni ad alte prestazioni o prototipare il sistema e quindi consentire la riscrittura dei colli di bottiglia (di solito in profondità in un ciclo interno) come un modulo C ecc.
xan
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.