Qual è la logica alla base dell'uso consigliato dei costrutti di ciclo for i in xrange(...)
in Python? Per il ciclo intero semplice, la differenza nei costi generali è notevole. Ho condotto un test semplice utilizzando due pezzi di codice:Razionale dietro la sintassi preferita da Python
file idiomatic.py
:
#!/usr/bin/env python
M = 10000
N = 10000
if __name__ == "__main__":
x, y = 0, 0
for x in xrange(N):
for y in xrange(M):
pass
File cstyle.py
:
#!/usr/bin/env python
M = 10000
N = 10000
if __name__ == "__main__":
x, y = 0, 0
while x < N:
while y < M:
y += 1
x += 1
profilatura risultati sono stati i seguenti:
bash-3.1$ time python cstyle.py
real 0m0.109s
user 0m0.015s
sys 0m0.000s
bash-3.1$ time python idiomatic.py
real 0m4.492s
user 0m0.000s
sys 0m0.031s
posso capisco perché la versione Python è più lenta - lo immagino ha molto a che fare con il chiamare xrange N volte, forse questo potrebbe essere eliminato se ci fosse un modo per riavvolgere un generatore. Tuttavia, con questa differenza di tempo di esecuzione, perché preferirebbe utilizzare la versione Pythonic?
Edit: Ho eseguito le prove di nuovo usando il codice signor Martelli fornito, ei risultati sono stati davvero meglio ora:
ho pensato di enumerare le conclusioni dal thread qui:
1) Un sacco di codice nell'ambito del modulo è una cattiva idea, anche se il codice è incluso in un blocco if __name__ == "__main__":
.
2) * Curiosamente, modificando il codice che apparteneva a thebadone
alla mia versione non corretta (lasciando y crescere senza reset) prodotta poca differenza in termini di prestazioni, anche per i valori più grandi di M e N.
I tempi sono viziati, credo. Esegui più prove e probabilmente esegui alcuni calcoli al suo interno per eliminare ogni possibile ottimizzazione dal ciclo – Yuliy
+1 Domanda molto interessante. Dopo aver letto la risposta di Martinelli, questa domanda è ancora più interessante per me, perché mostra le sottili differenze tra invocare un pezzo di codice dentro e fuori una funzione. – OscarRyz
-1: poiché la base della domanda era un codice fondamentalmente incorretto, la prego di chiudere la domanda. –