2009-09-04 21 views
5

Podemos hacer iteración numérico como:Lo que es más rápido en Python "mientras que" o "para xrange"

for i in xrange(10): 
    print i, 

y en C-style:

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

Sí, lo sé, el el primero es menos propenso a errores, más pitónico pero ¿es lo suficientemente rápido como versión C-style?

PS. Soy de C++ planet y bastante nuevo en Python one.

+6

¿Por qué no luchar por la simplicidad y la claridad? ¿Por qué preocuparse por las micro optimizaciones? –

+0

Pensé que 'xrange' se estaba desaprobando. –

+2

Jweede: No se cambia el nombre de xrange al rango en Python 3.0 (todos los métodos que devuelven la lista se reemplazan así ("obsoleto"), por ejemplo, filter, map y dict.keys()) – u0b34a0f6ae

Respuesta

13

Estoy seguro de que la versión while es más lenta. Python tendrá que buscar la operación de agregar para el objeto entero en cada vuelta del ciclo, etc., no es pura C solo porque así lo parece.

Y si quieres una versión de Pythonic exactamente lo anterior, el uso:

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

Editar: Mis tiempos se ven así. Esto es solo un bucle de ejecución tonto sin imprimir, solo para mostrarle lo que escribe "i + = 1", etc., los costos en 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

en Python 3, donde imprimir es una función, simplemente diga 'print (* range (10))' – u0b34a0f6ae

+1

@ kaizer.se: puede hacerlo en python 2.6 con 'from __future__ import print_function' – nosklo

+0

nosklo: lo tiene. Yo uso python2.5. (Estoy seguro de que los ejercicios en mi respuesta son inútiles, pero Edwards preguntó cómo hacerlo en un comentario a la respuesta de Roberto Liffredo.) – u0b34a0f6ae

13

¿A quién le importa? Seriamente. Si desea saber, use el paquete timeit (puede invocarlo desde la línea de comando con -m).

Pero no importa en absoluto, porque la diferencia es insignificante. Y, en general, Python no es un lenguaje que elijas si quieres velocidad.

+3

Sí, y con toda probabilidad, cada implementación de Python podría hacer esto de manera diferente. Confía en el compilador. Recuerdo el momento en que el código C DEBE usar "do-while" o "while" para ser más rápido ... de acuerdo con lo que sucedió en un viejo compilador roto hace diez años. Esto suena como el mismo tipo de pensamiento. – jakobengblom2

+1

Python ofrece velocidad no si optimiza sus bucles, pero si piensa en sus algoritmos y estructuras de datos, que pueden ser más fáciles de adaptar que en C. – u0b34a0f6ae

2

Ellos son tanto para evitar :-)

En términos generales, cada vez que veo una iteración sobre los números, veo algún código no Pythonic, que podría expresarse de una mejor manera el uso de iteraciones sobre las listas o generadores
En realidad, he dicho "pitónico", pero se trata de legibilidad. El uso de un código idiomático aumentará la legibilidad, y en última instancia también el rendimiento, porque el compilador sabrá mejor cómo optimizarlo.

+0

Roberto ayudaría a los programadores principiantes de python si nos muestra cómo haría lo anterior en una vía pitónica – Edwards

+0

+1 Muy cierto, aunque no es una respuesta directa a la pregunta. Además, generalmente iteras sobre una lista o similar y solo necesitas los números como información adicional, y para eso es 'enumerate()'. – balpha

+4

El fragmento de código no tiene suficiente contexto. Pero el error clásico es 'para i en xrange (len (A)): a [i] ...' eso simplemente está mal. –

4

El primero.

Quieres decir, más rápido de desarrollar, ¿verdad?

PD: No importa, las máquinas en estos días son tan rápidas que no tiene sentido reflexionar sobre las micro optimizaciones, antes de identificar los cuellos de botella usando un perfilador exhaustivo.

+3

Eso simplemente no es cierto. – roim

0

Bueno, si busca la eficiencia en el código numérico, debe usar numpy y scipy. Su integración se puede escribir rápidamente como numpy.sum(numpy.arange(10))

0

Si su programa es demasiado lento, intente utilizar psyco.

No se preocupe por el tipo de micro-optimización en su pregunta. Escriba su programa para mantenerlo (lo que incluye seguir el estilo de Python estándar para que otros programadores puedan leerlo más fácilmente).

-1

En Python, la versión más corta y clara es siempre mejor. Si no me equivoco, las funciones de rango y xrange no son nativas, si prueba xrange (sys.maxint + 1) obtendrá un error de desbordamiento.

Además, ¿para qué diablos podría ser útil? Si solo está imprimiendo 10 números, seguramente la legibilidad cuenta mil veces más, y no creo que va a imprimir más de un millón de números ...

Cuestiones relacionadas