Mide el tiempo de procesamiento con el módulo timeit de Python.

Negocio

Utilizando el módulo timeit de la biblioteca estándar de Python, puedes medir fácilmente el tiempo de ejecución de un proceso en tu código. Esto es útil para una comprobación rápida.

A continuación, se analizarán los dos casos siguientes.

  • Medida en un archivo Python:timeit.timeit(),timeit.repeat()
  • Medición con Jupyter Notebook:%timeit,%%timeit

Otra forma es utilizar time.time() para medir el tiempo transcurrido en el programa.

Medidas en archivos Python: timeit.timeit(), timeit.repeat()

Como ejemplo, mediremos el tiempo de procesamiento de una función sencilla, test(n), que calcula la suma de n números consecutivos.

import timeit

def test(n):
    return sum(range(n))

n = 10000
loop = 1000

result = timeit.timeit('test(n)', globals=globals(), number=loop)
print(result / loop)
# 0.0002666301020071842

Si pasas el código que quieres medir como una cadena a la función timeit.timeit(), se ejecutará NÚMERO de veces y se devolverá el tiempo que ha tardado.
El valor por defecto del número es 1.000.000. Tenga en cuenta que si utiliza el valor por defecto para un proceso que requiera mucho tiempo, éste tardará mucho.

Al pasar globals() como argumento globals, el código se ejecutará en el espacio de nombres global.
Sin esto, la función test y la variable n no se reconocen en el ejemplo anterior.

El código a especificar puede ser un objeto invocable en lugar de una cadena, por lo que puede especificarse como una expresión lambda sin argumentos; en este caso, no es necesario especificar el argumento globals.

result = timeit.timeit(lambda: test(n), number=loop)
print(result / loop)
# 0.00027574066299712287

La unidad del resultado es el segundo. Aquí, el resultado es el tiempo de procesamiento por ejecución dividido por el número de ejecuciones.

Si no divide, el valor del resultado simplemente se hará más grande a medida que aumente el número de ejecuciones.

print(timeit.timeit(lambda: test(n), number=1))
print(timeit.timeit(lambda: test(n), number=10))
print(timeit.timeit(lambda: test(n), number=100))
# 0.0003999490290880203
# 0.0038685189792886376
# 0.03517670702422038

Utilizando la función timeit.repeat() se puede ejecutar timeit() repetidamente. El resultado se obtendrá como una lista.

repeat = 5
print(timeit.repeat(lambda: test(n), repeat=repeat, number=100))
# [0.044914519996382296, 0.039663890027441084, 0.02868645201670006, 0.022745631984435022, 0.023260265996214002]

Medición con Jupyter Notebook:%timeit, %%timeit

En Jupyter Notebook (IPython), puedes utilizar los siguientes comandos mágicos; no es necesario importar el módulo timeit.

  • %timeit
  • %%timeit

%timeit

En %timeit, especifique el código de destino separado por un espacio como los argumentos de la línea de comandos.

Por defecto, el número y la repetición en timeit.timeit() se determinan automáticamente. También puede especificarlos con las opciones -n y -r.

Los resultados se calculan como media y desviación estándar.

%timeit test(n)
# 259 µs ± 4.87 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit -r 3 -n 10000 test(n)
# 237 µs ± 6.44 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)

%%timeit

El comando mágico %%timeit puede utilizarse para medir el tiempo de procesamiento de una celda completa.

Como ejemplo, vamos a ejecutar el mismo proceso utilizando NumPy. Las opciones -n y -r pueden omitirse.

Como medimos el tiempo de procesamiento de toda la celda, el siguiente ejemplo incluye el tiempo de importación de NumPy.

%%timeit -r 3 -n 10000
import numpy as np
a = np.arange(n)
np.sum(a)
# 19.7 µs ± 9.57 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)

No es necesario especificar el código de destino como argumento para %%timeit. Todo lo que tienes que hacer es escribir %%timeit al principio de una celda, por lo que es el más fácil de usar.

Copied title and URL