La programmazione in Python è più veloce rispetto a C, C ++ o Java? [chiuso]


27

C'è una diffusa convinzione tra i che quanto più dinamico e poco digitato la lingua, tanto più produttivo sarà il programmatore. Guido van Rossum ha scritto sulla programmazione della produttività usando Python nel 1998 e cercando sul Web vedo ancora persone che fanno riferimento a questa affermazione esatta:

Sintatticamente, il codice Python sembra uno pseudo codice eseguibile. Lo sviluppo del programma usando Python è 5-10 volte più veloce dell'uso di C / C ++ e 3-5 volte più veloce dell'uso di Java. In molti casi, un prototipo di un'applicazione può essere scritto in Python senza scrivere alcun codice C / C ++ / Java. Spesso, il prototipo è sufficientemente funzionale e si comporta abbastanza bene per essere consegnato come prodotto finale, risparmiando considerevoli tempi di sviluppo. Altre volte, il prototipo può essere tradotto in parte o interamente in C ++ o Java: la natura orientata agli oggetti di Python rende la traduzione un processo semplice.

Questo problema è stato adeguatamente valutato scientificamente? Se non fosse per forse per linguaggi di scripting fratelli come , o ?

Non sto cercando razionalizzazioni, analogie o spiegazioni sul perché potrebbe essere potenzialmente difficile rispondere, a meno che non sia l'opinione dei ricercatori o degli esperti che ha preso il tempo di esaminare il problema.

Inizialmente ho posto questa domanda su skeptics.SE , e qualcuno mi ha suggerito di farlo anche qui.


25
Bene, dal momento che hai limitato l'insieme delle possibili risposte, ho solo il coraggio di fare un commento ponendo un'altra domanda a cui rispondere prima (imho): esiste una metrica affidabile e stabilita per misurare la "produttività di un programmatore"?
Paul Michalik,

1
@Paul Michalik - Suppongo che qualsiasi documento di ricerca che guardasse alla produttività includerebbe una definizione (altrimenti sarebbe davvero difficile da misurare). Quindi, se qualcuno fa riferimento alla ricerca, sarebbe utile se includesse la definizione nella risposta. Probabilmente ci sono (suppongo) diversi modi perfettamente accettabili per misurare la produttività, forse "Il tempo necessario per superare un certo numero di richieste" sarebbe uno di questi.
Kit Sunde,

1
@Paul Michalik - Sicuro, ma quante delle dichiarazioni che leggi in libri, blog, discorsi e articoli dei programmatori sono effettivamente testate empiricamente? Sono sicuro che ci sono modi migliori o peggiori per misurare la produttività. Per esempio. Il "consumo / tempo del caffè" sarebbe probabilmente peggiore delle classiche "linee di codice / tempo". Ritirerei il giudizio su affermazioni specifiche sulla produttività che ne abbiamo visto uno e posso argomentare i meriti in base a ciò. Le affermazioni sulla produttività non sono semplicemente sbagliate, sono sicuro che "righe di codice / tempo" misurano qualcosa quando le persone non stanno cercando di distruggere la metrica.
Kit Sunde,

1
Potrebbe interessarti questo articolo: citeseerx.ist.psu.edu/viewdoc/…
DistantEcho

1
@ChrisF - Stai dicendo che questo quesiton non è applicabile a Programmers.SE? Certamente è per gli scettici, e sembrava adattarsi anche qui. Avevo l'impressione che non avresti dovuto fino a quando non ho letto un recente commento di Robert Cartaino su questa domanda: skeptics.stackexchange.com/q/1963/631 che sostanzialmente dice che va perfettamente bene se è di interesse per entrambe le comunità, e L'ho fatto solo dopo che un altro utente mi ha chiesto di farlo. Considerando che la domanda sta ottenendo voti, sembrerebbe che sia un interesse anche per questa comunità.
Kit Sunde,

Risposte:


17

L'articolo 1 di Ousterhout sui linguaggi di scripting suggerisce che più alto è il livello di programmazione, più produttivo è il programmatore. Se consideriamo che, come dice Boehm 2 , il numero di righe che un programmatore può scrivere in un dato tempo è costante e non dipende dalla lingua o dal suo tipo (basso livello, programmazione del sistema, scripting), si può facilmente credere alla richiesta. Le risultanti istruzioni-per-codice-riga-riga -ratio possono essere un ordine di grandezza (o diversi) meglio con i linguaggi di scripting che con i linguaggi di programmazione del sistema.

Poiché i linguaggi di scripting si basano fortemente su utility già pronte per attività comuni (ad esempio strutture di dati, manipolazione di stringhe), il loro uso principale di solito è migliorare la produttività con il costo di una velocità di esecuzione più bassa fornendo una sintassi facile da imparare ed efficiente per mantenere i programmi con. Non si ricorre a un linguaggio di scripting quando è necessaria la massima velocità di esecuzione.

[1]: JK Ousterhout, Scripting: Programmazione di livello superiore per il 21 ° secolo , Computer (IEEE), 1998
[2]: B. Boehm, Economia dell'ingegneria del software , Prentice Hall, 1981


9
Anche se questa è una buona risposta, non dimenticare che anche i moderni linguaggi non di scripting tendono ad essere pieni di utility pronte per lo sviluppo. Mi viene in mente C #. Chiunque ritenga che Python abbia più utilità predefinite di C #, capita semplicemente di conoscere Python meglio di C #. In realtà entrambi hanno una vasta e comparabile gamma di utility "integrate".
Roman Starkov,

@romkyns, per qualsiasi progetto non banale devi scrivere molto codice. Anche se hai molti mattoncini Lego, le Bionicle non si uniscono magicamente.

2
@Thor, ma aiuta davvero ad avere quei mattoncini Lego in anticipo, invece di dover prima costruire una trivella petrolifera, una fabbrica di plastica e un estrusore di blocchi lego.
Roman Starkov,

2
sia c ++ che Java hanno contenitori generici, e c ++ 11 ha una lib standard così completa per algoritmi di ordinamento e iteratori, ecc. Non sono convinto che qualcuno programmare Python sarebbe un vantaggio sostanziale. Inoltre, per uno, passo la maggior parte del mio tempo di programmazione a capire cosa devo fare, non a digitare. Quindi penso che contare solo la quantità di righe necessarie per fare una cosa non sia un chiaro indicatore di quanto velocemente un programmatore saresti in quella lingua.
Sam Redway,

7

Se si misura la produttività come "tempo di scrivere un programma semplice specifico", allora dipende molto più dall'esperienza del programmatore e dalla mente rapida rispetto alla lingua che si sta realmente valutando il programmatore, non la lingua.

Credo che i concorsi con codice a tempo indichino che la lingua non ha molta importanza per questo tipo di attività. Non esiste una lingua che vince tali sfide più facilmente di altre (almeno non se si consente la popolarità relativa delle lingue).

Se si misura la prestazione come "l'efficacia del miglior programma" scritto in una determinata lingua, allora è ancora meno dipendente dalla lingua. Vedi ad esempio i risultati del concorso AI Galcon . Il vincitore è scritto in Lisp. La prossima voce di Lisp, tuttavia, è classificata al numero 280. Cosa ci dice questo sull'idoneità del linguaggio a scrivere in modo efficace una grande intelligenza artificiale? Secondo me niente. Ci dice solo che "bocsimacko" ha ideato e implementato gli algoritmi più efficaci. Per la cronaca, il tempo non è stato un fattore importante in questo concorso: le persone hanno avuto più di due mesi per sviluppare il loro codice.

Infine, se si misura la prestazione come "costo a lungo termine per la manutenzione di un progetto", penso che ti piaccia qualcosa. Soprattutto se assumi solo le persone migliori per il lavoro e conti il ​​costo in ore lavorative anziché in dollari. Ho una forte opinione su quali lingue siano le migliori per questo, ma non avendo prove concrete a cui collegarti lascerò fuori questa opinione. Forse qualcun altro ha link per questo tipo di performance.


7
"stai davvero valutando il programmatore, non la lingua" - Non se questo è effettivamente fatto scientificamente. Prendi 100 programmatori. Seleziona un progetto generale come "Scrivi un'app di calendario con questi requisiti specifici". I requisiti sono legati al collaudo automatico delle unità. 50 programmatori scrivono l'app in C ++, 50 in Python, selezionati a caso in modo che gli sviluppatori di qualità vengano distribuiti uniformemente. Il risultato sarebbe un punteggio che combina il tempo medio di completamento con il numero di unit test superati. Confronta la media dei risultati di Python con la media del risultato C ++ e ... SCIENZA!
Morgan Herlocker,

2
@Prof Forse se ne ottieni migliaia di ciascuno ... ma comunque, come controlli il fatto che solo le persone con una certa mentalità e un certo livello di abilità conosceranno il C ++?
Roman Starkov,

potresti fare in modo che il tuo campione venga estratto solo da persone che possono superare un test di competenza in C ++ e Python. Molti dei miei vecchi professori stavano facendo studi molto simili. Inoltre fai un paio di ipotesi che altri hanno discusso qui: programmers.stackexchange.com/q/73715/3792
Morgan Herlocker

6

http://page.mi.fu-berlin.de/prechelt/Biblio/jccpprtTR.pdf è uno dei pochi studi di cui sono a conoscenza che ha fatto un confronto diretto effettivo tra produttività in varie lingue. È vecchio, ma vale la pena leggere se trovi l'argomento interessante. Il confronto presenta una serie di importanti carenze di cui l'articolo è molto onesto.

Il risultato complessivo è che linguaggi di basso livello (ad es. C, C ++) impiegano più tempo a scrivere, possono richiedere molta meno memoria e possono funzionare molto più velocemente. Ma con altissima variabilità. I linguaggi di scripting di alto livello tendono a impiegare la metà del tempo per scrivere e hanno meno variabilità nell'approccio. In una misura inizialmente sorprendente, tende ad esserci un modo ovvio di fare qualcosa in un linguaggio di scripting.

Si noti che tutti i numeri delle prestazioni per Java dovrebbero essere presi con una grossa quantità di sale: la carta è stata prodotta negli anni '90 prima che le persone avessero molta esperienza con Java e prima che la JVM fosse ben ottimizzata. Entrambi i fattori dovrebbero avere un impatto significativo.


1

Per dirla in generale, scrivere un programma in Python sarà di solito più veloce rispetto alla scrittura dello stesso programma in C, C ++, Java.

È anche probabile che funzioni più lentamente.

Esistono, naturalmente, applicazioni particolari per le quali altre lingue potrebbero essere più veloci perché alcuni compiti coinvolti sono supportati "in modo più nativo".

Anche se non sono a conoscenza di studi per confermare questo aumento di velocità / produttività (come ha detto un commentatore, questo può essere difficile da misurare con precisione), c'è stata una ricerca diretta sull'espressività del linguaggio.

Penso che ci sia qualche merito per una correlazione tra espressività del linguaggio e velocità di programmazione. Immagina solo un semplice schema di iterazione e come un Pythonic for-loop o la comprensione dell'elenco possono essere più concisi. Non solo può essere digitato immediatamente più velocemente, ma elimina anche le preoccupazioni di errori off-by-one, indici fuori limite e altri problemi simili che possono rallentare significativamente il processo di codifica.

Questo mostra una tabella una stima per i rapporti espressivi delle lingue. Mentre dovrebbe essere preso con un granello di sale, le note a piè di pagina che menziona sono molto utili.

http://en.wikipedia.org/wiki/Comparison_of_programming_languages#Expressiveness


-5

L'ultima volta che ho usato Java (un po 'di tempo fa, è vero) ci sono voluti uno schermo pieno di codice per aprire e scrivere su un file. Confrontalo con un paio di righe in Python o Perl e puoi indovinare quale è più veloce.

Ovviamente tutte le lingue hanno i loro punti di forza e di debolezza, ma per la maggior parte delle attività Python sarà più veloce da scrivere.


6
"Ci sono voluti una schermata piena di codice per aprire e scrivere in un file": Mettere questo in una classe di utilità con due metodi write()e read()e nel resto del tuo accesso ai file di progetto Java sarà il più conciso in Python. Penso che il tuo esempio sia un po 'troppo limitato per confrontare Python e Java (anche se concordo sul fatto che Java tende ad essere più dettagliato).
Giorgio,

Certo, ma Python, Perl e le lingue superiori hanno generalmente pensato a queste cose in anticipo, e quindi non è necessario scrivere le classi di utilità (o non così tante). L'uso di una classe di utilità richiede ancora tempo ed è un principio del codice riutilizzabile che applica sia Java che Python in base a ciò che si sta effettivamente facendo.
wobbily_col,

Ciò presuppone che Java abbia bisogno di 50 - 60 righe di codice solo per aprire e scrivere un file. Questo semplicemente non è corretto.
h22,
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.