Skip to content

Misurare il tempo di esecuzione con timeit in Python

Python

In Python, puoi facilmente misurare il tempo di esecuzione con il modulo timeit della libreria standard.

Questo articolo descrive due casi:

  • Misura il tempo di esecuzione nello script Python:timeit.timeit(), timeit.repeat()
  • Misura il tempo di esecuzione in Jupyter Notebook:%timeit, %%timeit

Misura il tempo di esecuzione nello script Python:timeit.timeit(), timeit.repeat()

Definire un semplice test di funzione (n) che calcoli la somma di n numeri consecutivi come e ne misuri il tempo di esempio.

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

Passando il codice che vuoi misurare come stringa a timeit.timeit(), il codice viene eseguito più volte e tuo viene restituito il suo tempo di esecuzione.

Il valore predefinito di numero è 1.000.000. Tieni presente che se esegui codice dispendioso in termini di tempo con il valore predefinito, ci vuole molto tempo.

Il codice viene eseguito nello spazio dei nomi globale passando globals() a globals. Senza di essa, il test di funzione e la variabile n non verrebbero riconosciuti nell’esempio precedente.

Il codice può essere un oggetto richiamabile anziché una stringa, quindi puoi anche specificarlo con un’espressione lambda senza argomenti. In questo caso, non è necessario specificare l’argomento globale.

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

timeit.timeit() richiede semplicemente il tempo (in secondi) impiegato per eseguire il numero di codice di volte.

Nell’esempio sopra, il tempo per l’esecuzione viene misurato dividendo per il numero di esecuzioni (numero). Se non dividi, il valore del risultato aumenta semplicemente all’aumentare del numero di esecuzioni.

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

timeit.repeat() può essere utilizzato per ripetere timeit(). Il risultato viene restituito come un elenco.

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

Misura il tempo di esecuzione in Jupyter Notebook:%timeit, %%timeit

In Jupyter Notebook (IPython), puoi utilizzare i comandi magici %timeit e %%timeit per misurare il tempo di esecuzione del tuo codice. Non è necessario importare il modulo timeit.

%tempo

Per %timeit, specifica il codice di destinazione dopo %timeit con uno spazio.

Per impostazione predefinita, il numero e la ripetizione in timeit.timeit() vengono impostati automaticamente. Può anche essere specificato con le opzioni -ne -r.

Vengono calcolate la media e la deviazione standard.

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

%%tempo

Puoi usare il comando magico %%timeit per misurare il tempo di esecuzione della cella.

Ad esempio, prova a eseguire lo stesso processore usando NumPy. Vieni con %timeit, -ne -r sono facoltativi.

Si noti che %%timeit misura il tempo di esecuzione dell’intera cella, quindi l’esempio seguente include il tempo per importare 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)

%%timeit è il modo più semplice per misurare il tempo di esecuzione perché scrivi semplicemente %%timeit all’inizio della cella.

Vedere il collegamento seguente per un esempio di Jupyter Notebook (.ipynb).