Ved hjælp af timeit-modulet i Python-standardbiblioteket kan du nemt måle eksekveringstiden for en proces i din kode. Dette er nyttigt til en hurtig kontrol.
Følgende to tilfælde vil blive behandlet her.
- Måling i en Python-fil:
timeit.timeit()
,timeit.repeat()
- Måling med Jupyter Notebook:
%timeit
,%%timeit
En anden måde er at bruge time.time() til at måle den forløbne tid i programmet.
Målinger i Python-filer: timeit.timeit(), timeit.repeat()
Som et eksempel vil vi måle behandlingstiden for en simpel funktion, test(n), som beregner summen af n på hinanden følgende 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
Hvis du sender den kode, du vil måle, som en streng til funktionen timeit.timeit(), vil den blive udført NUMMER af gange, og den tid, det tog, vil blive returneret.
Standardværdien for antal er 1.000.000.000. Bemærk, at hvis du bruger standardværdien til en tidskrævende proces, vil det tage meget lang tid.
Ved at overgive globals() som argument globals, vil koden blive udført i det globale navnerum.
Uden dette genkendes funktionen test og variablen n ikke i eksemplet ovenfor.
Den kode, der skal angives, kan være et objekt, der kan kaldes i stedet for en streng, så den kan angives som et lambdaudtryk uden argumenter; i dette tilfælde behøver argumentet globals ikke at blive angivet.
result = timeit.timeit(lambda: test(n), number=loop)
print(result / loop)
# 0.00027574066299712287
Enheden for resultatet er sekunder. Her er resultatet behandlingstiden pr. udførelse divideret med antallet af udførelser.
Hvis du ikke deler, vil resultatværdien simpelthen blive større, når du øger antallet af udførelser.
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
Ved hjælp af funktionen timeit.repeat() kan timeit() udføres gentagne gange. Resultatet fås som en liste.
repeat = 5
print(timeit.repeat(lambda: test(n), repeat=repeat, number=100))
# [0.044914519996382296, 0.039663890027441084, 0.02868645201670006, 0.022745631984435022, 0.023260265996214002]
Måling med Jupyter Notebook:%timeit, %%timeit
I Jupyter Notebook (IPython) kan du bruge følgende magiske kommandoer; der er ikke behov for at importere timeit-modulet.
%timeit
%%timeit
%timeit
I %timeit skal du angive målkoden adskilt af et mellemrum som ved kommandolinjeargumenter.
Som standard bestemmes antallet og gentagelsen i timeit.timeit() automatisk. Du kan også angive dem med indstillingerne -n og -r.
Resultaterne er beregnet som gennemsnit og standardafvigelse.
%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
Den magiske kommando %%timeit kan bruges til at måle behandlingstiden for en hel celle.
Lad os som eksempel køre den samme proces med NumPy. Optionerne -n og -r kan udelades.
Da vi måler behandlingstiden for hele cellen, omfatter det følgende eksempel også tiden til at importere 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 er ikke nødvendigt at angive målkoden som et argument for %%timeit. Det eneste du skal gøre er at skrive %%timeit i begyndelsen af en celle, så det er den nemmeste at bruge.