¿Cuál es la lógica detrás del uso defendido de las construcciones de bucle de estilo for i in xrange(...)
en Python? Para el bucle entero simple, la diferencia en los gastos generales es considerable. Llevé a cabo una prueba sencilla utilizando dos piezas de código:Justificación de Python preferido para la sintaxis
archivos 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
Archivo 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
Profiling resultados fueron los siguientes:
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
que pueda entender por qué la versión Pythonic es más lenta, me lo imagino tiene mucho que ver con llamar a xrange N veces, quizás esto podría eliminarse si hubiera una forma de rebobinar un generador. Sin embargo, con esta gran diferencia en el tiempo de ejecución, ¿por qué uno preferiría usar la versión Pythonic?
Editar: que lleva a cabo las pruebas de nuevo utilizando el código proporcionado el Sr. Martelli, y los resultados eran de hecho mejor ahora:
que pensé en enumerar las conclusiones de ese tema aquí:
1) Un montón de código en el alcance del módulo es una mala idea,, incluso si el código está encerrado en un bloque if __name__ == "__main__":
.
2) * Curiosamente, la modificación del código que pertenecía a thebadone
a mi versión incorrecta (dejando crecer y sin restablecer) producido poca diferencia en el rendimiento, incluso para valores grandes de M y N.
Su tiempo es defectuoso, creo. Ejecute varias pruebas, y tal vez realice algunos cálculos en su interior para deshacerse de cualquier posible optimización fuera del ciclo – Yuliy
+1 Pregunta muy interesante. Después de leer la respuesta de Martinelli, esta pregunta es aún más interesante para mí, porque muestra las diferencias sutiles entre invocar un fragmento de código dentro y fuera de una función. – OscarRyz
-1: Como la base de la pregunta era un código fundamentalmente incorrecto, ¿podría cerrar la pregunta? –