Med hjälp av modulen timeit i Pythons standardbibliotek kan du enkelt mäta exekveringstiden för en process i din kod. Detta är användbart för en snabb kontroll.
Följande två fall kommer att diskuteras här.
- Mätning i en Python-fil:
timeit.timeit()
,timeit.repeat()
- Mätning med Jupyter Notebook:
%timeit
,%%timeit
Ett annat sätt är att använda time.time() för att mäta den förflutna tiden i programmet.
Mätningar i Python-filer: timeit.timeit(), timeit.repeat()
Som exempel ska vi mäta bearbetningstiden för en enkel funktion, test(n), som beräknar summan av n på varandra följande tal.
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
Om du skickar koden du vill mäta som en sträng till funktionen timeit.timeit() kommer den att exekveras NUMMER av gånger och den tid det tog kommer att returneras.
Standardvärdet för antal är 1 000 000 000. Observera att om du använder standardvärdet för en tidskrävande process kommer den att ta mycket tid.
Genom att lämna globals() som argument globals kommer koden att exekveras i det globala namnområdet.
Utan detta känns inte funktionen test och variabeln n igen i exemplet ovan.
Koden som ska specificeras kan vara ett anropsbart objekt i stället för en sträng, så den kan specificeras som ett lambdauttryck utan argument; i det här fallet behöver argumentet globals inte anges.
result = timeit.timeit(lambda: test(n), number=loop)
print(result / loop)
# 0.00027574066299712287
Enheten för resultatet är sekunder. Här är resultatet bearbetningstiden per utförande dividerat med antalet utförande.
Om du inte dividerar kommer resultatvärdet helt enkelt att bli större när du ökar antalet utföranden.
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
Med hjälp av funktionen timeit.repeat() kan timeit() exekveras upprepade gånger. Resultatet kommer att erhållas som en lista.
repeat = 5
print(timeit.repeat(lambda: test(n), repeat=repeat, number=100))
# [0.044914519996382296, 0.039663890027441084, 0.02868645201670006, 0.022745631984435022, 0.023260265996214002]
Mätning med Jupyter Notebook:%timeit, %%timeit
I Jupyter Notebook (IPython) kan du använda följande magiska kommandon; du behöver inte importera modulen timeit.
%timeit
%%timeit
%timeit
I %timeit anger du målkoden separerad med ett mellanslag som kommandoradsargument.
Som standard bestäms antalet och upprepningen i timeit.timeit() automatiskt. Du kan också ange dem med alternativen -n och -r.
Resultaten beräknas som medelvärde och standardavvikelse.
%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
Det magiska kommandot %%timeit kan användas för att mäta bearbetningstiden för en hel cell.
Som exempel kan vi köra samma process med NumPy. Alternativen -n och -r kan utelämnas.
Eftersom vi mäter bearbetningstiden för hela cellen, inkluderar följande exempel tiden för att importera 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)
Det är inte nödvändigt att ange målkoden som ett argument för %%timeit. Allt du behöver göra är att skriva %%timeit i början av en cell, så det är den enklaste att använda.