Meet de verwerkingstijd met Python’s timeit module.

Bedrijf

Met behulp van de timeit module van de Python standaard bibliotheek kunt u eenvoudig de uitvoeringstijd van een proces in uw code meten. Dit is handig voor een snelle controle.

De volgende twee gevallen zullen hier worden besproken.

  • Maatregel in een Python bestand:timeit.timeit(),timeit.repeat()
  • Meting met Jupyter Notebook:%timeit,%%timeit

Een andere manier is om time.time() te gebruiken om de verstreken tijd in het programma te meten.

Metingen in Python-bestanden: timeit.timeit(), timeit.repeat()

Als voorbeeld zullen wij de verwerkingstijd meten van een eenvoudige functie, test(n), die de som berekent van n opeenvolgende getallen.

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

Als je de code die je wilt meten als een string doorgeeft aan de timeit.timeit() functie, zal deze een AANTAL keren worden uitgevoerd en de tijd die het duurde zal worden teruggegeven.
De standaardwaarde voor aantal is 1.000.000. Merk op dat als u de standaardwaarde gebruikt voor een tijdrovend proces, het veel tijd in beslag zal nemen.

Door globals() als argument globals mee te geven, zal de code worden uitgevoerd in de globale naamruimte.
Zonder dit worden de functie test en de variabele n niet herkend in het bovenstaande voorbeeld.

De te specificeren code kan een aanroepbaar object zijn in plaats van een string, zodat het kan worden gespecificeerd als een lambda-expressie zonder argumenten; in dit geval hoeft het argument globals niet te worden gespecificeerd.

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

De eenheid van het resultaat is seconden. Hier is de uitkomst de verwerkingstijd per uitvoering gedeeld door het aantal uitvoeringen.

Als u niet deelt, zal de resultaatwaarde gewoon groter worden naarmate u het aantal uitvoeringen verhoogt.

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

Met behulp van de functie timeit.repeat() kan timeit() herhaaldelijk worden uitgevoerd. Het resultaat wordt verkregen als een lijst.

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

Meting met Jupyter Notebook:%timeit, %%timeit

In Jupyter Notebook (IPython) kunt u de volgende magische commando's gebruiken; het is niet nodig om de timeit module te importeren.

  • %timeit
  • %%timeit

%timeit

Geef in %timeit de doelcode op, gescheiden door een spatie zoals commandoregelargumenten.

Standaard worden het aantal en de herhaling in timeit.timeit() automatisch bepaald. Je kunt ze ook opgeven met de -n en -r opties.

De resultaten worden berekend als gemiddelde en standaardafwijking.

%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

Het magische commando %%timeit kan worden gebruikt om de verwerkingstijd van een hele cel te meten.

Laten we bij wijze van voorbeeld hetzelfde proces uitvoeren met NumPy. De -n en -r opties kunnen worden weggelaten.

Aangezien we de verwerkingstijd van de hele cel meten, wordt in het volgende voorbeeld ook de tijd voor het importeren van NumPy meegerekend.

%%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)

Het is niet nodig om de doelcode op te geven als argument voor %%timeit. Het enige wat je hoeft te doen is %%timeit aan het begin van een cel te schrijven, dus het is het gemakkelijkst te gebruiken.