Usando o módulo timeit da biblioteca estándar de Python, pode medir facilmente o tempo de execución dun proceso no seu código. Isto é útil para unha comprobación rápida.
Os dous casos seguintes serán discutidos aquí.
- Medir nun ficheiro Python:
timeit.timeit()
,timeit.repeat()
- Medición con Jupyter Notebook:
%timeit
,%%timeit
Outra forma é usar time.time() para medir o tempo transcorrido no programa.
Medidas en ficheiros Python: timeit.timeit(), timeit.repeat()
Como exemplo, mediremos o tempo de procesamento dunha función sinxela, test(n), que calcula a 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
Se pasas o código que queres medir como cadea á función timeit.timeit(), executarase NÚMERO de veces e devolverase o tempo que tardou.
O valor predeterminado para o número é 1.000.000. Teña en conta que se usa o valor predeterminado para un proceso que leva moito tempo, levará moito tempo.
Ao pasar globals() como argumento globals, o código executarase no espazo de nomes global.
Sen isto, a proba de función e a variable n non se recoñecen no exemplo anterior.
O código a especificar pode ser un obxecto invocable en lugar dunha cadea, polo que pode especificarse como unha expresión lambda sen argumentos; neste caso, non é necesario especificar o argumento globals.
result = timeit.timeit(lambda: test(n), number=loop)
print(result / loop)
# 0.00027574066299712287
A unidade do resultado son os segundos. Aquí, a saída é o tempo de procesamento por execución dividido polo número de execucións.
Se non divides, o valor do resultado simplemente aumentará a medida que aumentes o número de execucións.
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
Usando a función timeit.repeat(), timeit() pódese executar repetidamente. O resultado obterase como unha 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), podes usar os seguintes comandos máxicos; non é necesario importar o módulo timeit.
%timeit
%%timeit
%timeit
En %timeit, especifique o código de destino separado por un espazo como os argumentos da liña de comandos.
Por defecto, o número e a repetición en timeit.timeit() determínanse automaticamente. Tamén pode especificalos coas opcións -n e -r.
Os resultados calcúlanse como media e 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
O comando máxico %%time pódese usar para medir o tempo de procesamento dunha cela enteira.
Como exemplo, executemos o mesmo proceso usando NumPy. As opcións -n e -r pódense omitir.
Dado que medimos o tempo de procesamento de toda a cela, o seguinte exemplo inclúe o tempo para importar 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)
Non é necesario especificar o código de destino como argumento para %%timeit. Todo o que tes que facer é escribir %%timeit ao comezo dunha cela, polo que é o máis sinxelo de usar.