2009-09-04 11 views
5

Possiamo fare iterazione numerico come:cosa è più veloce in Python "mentre" o "per xrange"

for i in xrange(10): 
    print i, 

e in C-style:

i = 0 
while i < 10: 
    print i, 
    i = i + 1 

sì, lo so, il il primo è meno incline agli errori, più pitone ma è abbastanza veloce come versione in stile C?

PS. Sono di C++ planet e piuttosto nuovo su Python.

+6

Perché non cercare la semplicità e la chiarezza? Perché agitarsi sulle micro-ottimizzazioni? –

+0

Ho pensato che 'xrange' fosse deprecato. –

+2

Jweede: Nessuna xrange viene rinominata nell'intervallo in Python 3.0 (tutti i metodi di ritorno elenco vengono sostituiti in questo modo ("deprecato"), ad esempio filtro, mappa e dict.keys()) – u0b34a0f6ae

risposta

13

Sono sicuro che la versione while è più lenta. Python dovrà cercare l'operazione di aggiunta per l'oggetto intero ad ogni giro del ciclo, ecc., Non è pura C solo perché sembra proprio!

E se volete una versione divinatorio di esattamente quanto sopra, l'uso:

print " ".join(str(i) for i in xrange(10)) 

Edit: I miei tempi simile a questa. Questo è solo uno stupido ciclo di esecuzione senza stampa, solo per mostrarti cosa scrivere "i + = 1" costi ecc in Python.

$ python -mtimeit "i=0" "while i < 1000: i+=1" 
1000 loops, best of 3: 303 usec per loop 
$ python -mtimeit "for i in xrange(1000): pass" 
10000 loops, best of 3: 120 usec per loop 
+3

in Python 3, dove la stampa è una funzione, basta dire 'stampa (* intervallo (10))' – u0b34a0f6ae

+1

@ kaizer.se: è possibile farlo in python 2.6 con 'da __future__ import print_function' – nosklo

+0

nosklo: giusto sei. Io uso python2.5. (Sono sicuro che gli esercizi nella mia risposta sono inutili, ma Edwards ha chiesto come farlo in un commento alla risposta di Roberto Liffredo.) – u0b34a0f6ae

13

A chi importa? Sul serio. Se vuoi sapere, usa il pacchetto timeit (puoi richiamarlo dalla riga di comando con -m).

Ma non importa affatto, perché la differenza è trascurabile. E in generale, Python non è un linguaggio che scegli se vuoi la velocità.

+3

Sì, e con ogni probabilità, ogni implementazione di Python potrebbe farlo in modo diverso. Fidati del compilatore. Ricordo il tempo in cui il codice C DOVREBBE usare "do-while" o "while" per essere più veloce ... secondo quanto accaduto su un vecchio compilatore rotto dieci anni fa. Sembra lo stesso tipo di pensiero. – jakobengblom2

+1

Python offre velocità non se ottimizzi i tuoi loop ma se pensi ai tuoi algoritmi e alle strutture dati, che potrebbero essere più facili da adattare rispetto a C. – u0b34a0f6ae

2

Sono sia per evitare :-)

In generale, ogni volta che vedo un'iterazione oltre i numeri, io vedo un certo codice non divinatorio, che potrebbe essere espresso in modo migliore utilizzando iterazioni sulle liste o generatori.
In realtà, ho detto "pythonic", ma è tutto basato sulla leggibilità . L'uso di codice idiomatico aumenterà la leggibilità e, in definitiva, anche le prestazioni, perché il compilatore saprà meglio come ottimizzarlo.

+0

Roberto aiuta i programmatori python principianti se ci mostri come faresti sopra in un modo pitone – Edwards

+0

+1 Molto vero, anche se non è una risposta diretta alla domanda. Inoltre, di solito esegui iterazioni su alcune liste o simili e hai solo bisogno dei numeri come informazioni aggiuntive --- e questo è ciò che 'enumerate()' è per. – balpha

+4

Lo snippet di codice non ha un contesto sufficiente. Ma l'errore classico è "for i in xrange (len (A)): a [i] ..." è sbagliato. –

4

Il primo.

Vuoi dire, più veloce da sviluppare, giusto?

PS: Non importa, le macchine in questi giorni sono così veloci che non ha senso ponderare su micro ottimizzazioni, prima di identificare i colli di bottiglia utilizzando un profiler approfondito.

+3

Questo semplicemente non è vero. – roim

0

Bene, se si utilizza l'efficienza nel codice numerico, è necessario utilizzare numpy e scipy. L'integrazione può essere rapidamente scritta come numpy.sum(numpy.arange(10))

0

Se il programma è troppo lento, provare a utilizzare psyco.

Non preoccuparti del tipo di micro-ottimizzazione nella tua domanda. Scrivi il tuo programma per essere manutenibile (che include lo stile standard di Python in modo che altri programmatori possano leggerlo più facilmente).

-1

In Python, la versione più corta e chiara è sempre migliore. Se non sbaglio, le funzioni range e xrange non sono native, se provi xrange (sys.maxint + 1) otterrai un errore di overflow.

Inoltre, che diavolo potrebbe essere utile? Se stai stampando solo 10 numeri, allora sicuramente la leggibilità conta mille volte di più - e non penso che stamperai più di un milione di numeri ...

Problemi correlati