2009-08-10 11 views
14

Cuando ejecuto el siguiente código fuera de timeit(), parece completarse instantáneamente. Sin embargo, cuando lo ejecuto dentro de la función timeit(), lleva mucho más tiempo. ¿Por qué?python: función slow timeit()

>>> import timeit 
>>> t = timeit.Timer("3**4**5") 
>>> t.timeit() 
16.55522028637718 

Usando: Python 3.1 (x86) - AMD Athlon 64 X2 - WinXP (32 bits)

+0

Paginación Alex Martelli, Alex Martelli, por favor comente sobre el módulo python timeit ... – hughdbrown

+0

RichieHindle ya lo hizo bien mientras estaba desconectado. Y, siempre uso "python -mtimeit" de todos modos, nunca timeit dentro del intérprete interactivo o un programa ;-) –

Respuesta

26

La función timeit() ejecuta el código muchas veces (por defecto de un millón) y toma un promedio de los tiempos

Para ejecutar el código de una sola vez, hacer esto:

t.timeit(1) 

pero que le dará resultados sesgados - se repite por una buena razón.

Para que el tiempo por ciclo haya permitido que se repita, divida el resultado por el número de bucles. Utilice un valor más pequeño para el número de repeticiones de un millón si ya es demasiado:

count = 1000 
print t.timeit(count)/count 
+6

¡Sí! También recomiendo usar 'python -mtimeit' desde una línea de comando en lugar de timeit como un módulo - la versión de línea de comando tiene demasiadas pequeñas cosas útiles que no se obtienen del módulo (repitiendo un número variable de veces dependiendo de cómo lento/rápido es lo que está midiendo, por ejemplo: una gran técnica de microencuadre, lástima que el módulo no lo ofrezca, etc., etc.). –

+0

@Alex Su comentario aquí no está claro para mí. ¿Puede aclarar qué funcionalidad adicional está disponible en la CLI? – Tshepang

+1

@Tshepang: el uso de tiempo de CLI selecciona el número de repeticiones "mágicamente" - pocas para código lento que se mide, más para código más rápido, mucho para código muy rápido - exactitud de equilibrio y tiempo para obtener resultados. –

6

Debido TimeIt defecto a ejecutarlo un millón de veces. El punto es hacer micro-puntos de referencia, y la única forma de obtener tiempos precisos de eventos cortos es repetirlos muchas veces.

3

De acuerdo con docs, Timer.timeit() ejecuta su código un millón de veces de forma predeterminada. Utilice el parámetro "número" para cambiar este valor predeterminado:

t.timeit(number=100) 

por ejemplo.

2

Timeit se ejecuta para un millón de bucles por defecto.

También puede tener problemas de orden de operaciones: (3**4)**5 != 3**4**5.

+0

Gracias a todos. Muy útil. Y sí, ese era el orden previsto de operaciones. –