while python3 loop for python performance benchmarking

python3 - ¿Por qué es más rápido usar looping over range() en Python que usar un loop while?



using for in python 3 (5)

El otro día estaba haciendo una evaluación comparativa de Python y encontré algo interesante. A continuación se muestran dos bucles que hacen más o menos lo mismo. El bucle 1 toma aproximadamente el doble de tiempo que el bucle 2 para ejecutarse.

Bucle 1:

int i = 0 while i < 100000000: i += 1

Lazo 2:

for n in range(0,100000000): pass

¿Por qué el primer bucle es mucho más lento? Sé que es un ejemplo trivial pero ha despertado mi interés. ¿Hay algo especial en la función range () que la hace más eficiente que incrementar una variable de la misma manera?


Consulte el desmontaje del código de byte de Python, puede obtener una idea más concreta.

use while loop:

1 0 LOAD_CONST 0 (0) 3 STORE_NAME 0 (i) 2 6 SETUP_LOOP 28 (to 37) >> 9 LOAD_NAME 0 (i) # <- 12 LOAD_CONST 1 (100000000) # <- 15 COMPARE_OP 0 (<) # <- 18 JUMP_IF_FALSE 14 (to 35) # <- 21 POP_TOP # <- 3 22 LOAD_NAME 0 (i) # <- 25 LOAD_CONST 2 (1) # <- 28 INPLACE_ADD # <- 29 STORE_NAME 0 (i) # <- 32 JUMP_ABSOLUTE 9 # <- >> 35 POP_TOP 36 POP_BLOCK

El cuerpo del bucle tiene 10 op.

rango de uso:

1 0 SETUP_LOOP 23 (to 26) 3 LOAD_NAME 0 (range) 6 LOAD_CONST 0 (0) 9 LOAD_CONST 1 (100000000) 12 CALL_FUNCTION 2 15 GET_ITER >> 16 FOR_ITER 6 (to 25) # <- 19 STORE_NAME 1 (n) # <- 2 22 JUMP_ABSOLUTE 16 # <- >> 25 POP_BLOCK >> 26 LOAD_CONST 2 (None) 29 RETURN_VALUE

El cuerpo del bucle tiene 3 op.

El tiempo para ejecutar el código C es mucho más corto que el intérprete y se puede ignorar.


Hay que decir que hay una gran cantidad de creación y destrucción de objetos en el bucle while.

i += 1

es lo mismo que:

i = i + 1

Pero como las entradas de Python son inmutables, no modifica el objeto existente; más bien crea un objeto nuevo con un nuevo valor. Es básicamente:

i = new int(i + 1) # Using C++ or Java-ish syntax

El recolector de basura también tendrá una gran cantidad de limpieza que hacer. "La creación de objetos es cara".


La mayoría de las llamadas de método incorporadas de Python se ejecutan como código C. El código que hay que interpretar es mucho más lento. En términos de eficiencia de memoria y velocidad de ejecución, la diferencia es gigantesca. Los internos de python se han optimizado al extremo, y es mejor aprovechar esas optimizaciones.


Porque estás ejecutando más a menudo en código escrito en C en el interpretador. es decir, i + = 1 está en Python, así que lento (comparativamente), mientras que el rango (0, ...) es una llamada de C, el bucle for se ejecutará principalmente en C también.


range() se implementa en C, mientras que i += 1 se interpreta.

Usar xrange() podría hacerlo incluso más rápido para grandes números. Comenzar con Python 3.0 range() es el mismo que anteriormente xrange() .