Usando il modulo timeit della libreria standard di Python, potete facilmente misurare il tempo di esecuzione di un processo nel vostro codice. Questo è utile per un rapido controllo.
Qui verranno discussi i seguenti due casi.
- Misura in un file Python:
timeit.timeit()
,timeit.repeat()
- Misurazione con Jupyter Notebook:
%timeit
,%%timeit
Un altro modo è usare time.time() per misurare il tempo trascorso nel programma.
Misure in file Python: timeit.timeit(), timeit.repeat()
Come esempio, misureremo il tempo di elaborazione di una semplice funzione, test(n), che calcola la somma di n numeri consecutivi.
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 passate il codice che volete misurare come una stringa alla funzione timeit.timeit(), verrà eseguito NUMERO di volte e verrà restituito il tempo impiegato.
Il valore predefinito per il numero è 1.000.000. Notate che se usate il valore predefinito per un processo che richiede molto tempo, questo richiederà molto tempo.
Passando globals() come argomento globals, il codice sarà eseguito nello spazio dei nomi globale.
Senza questo, la funzione test e la variabile n non sono riconosciute nell'esempio precedente.
Il codice da specificare può essere un oggetto richiamabile invece di una stringa, quindi può essere specificato come un'espressione lambda senza argomenti; in questo caso, l'argomento globals non deve essere specificato.
result = timeit.timeit(lambda: test(n), number=loop)
print(result / loop)
# 0.00027574066299712287
L'unità del risultato sono i secondi. Qui, l'output è il tempo di elaborazione per esecuzione diviso per il numero di esecuzioni.
Se non si divide, il valore del risultato diventerà semplicemente più grande man mano che si aumenta il 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
Usando la funzione timeit.repeat(), timeit() può essere eseguito ripetutamente. Il risultato sarà ottenuto come lista.
repeat = 5
print(timeit.repeat(lambda: test(n), repeat=repeat, number=100))
# [0.044914519996382296, 0.039663890027441084, 0.02868645201670006, 0.022745631984435022, 0.023260265996214002]
Misurazione con Jupyter Notebook:%timeit, %%timeit
In Jupyter Notebook (IPython), puoi usare i seguenti comandi magici; non c'è bisogno di importare il modulo timeit.
%timeit
%%timeit
%timeit
In %timeit, specificate il codice di destinazione separato da uno spazio come gli argomenti della linea di comando.
Per impostazione predefinita, il numero e la ripetizione in timeit.timeit() sono determinati automaticamente. Potete anche specificarli con le opzioni -n e -r.
I risultati sono calcolati come media e 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)
%%timeit
Il comando magico %%timeit può essere usato per misurare il tempo di elaborazione di un'intera cella.
Come esempio, eseguiamo lo stesso processo usando NumPy. Le opzioni -n e -r possono essere omesse.
Poiché misuriamo il tempo di elaborazione dell'intera cella, 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)
Non c'è bisogno di specificare il codice di destinazione come argomento per %%timeit. Tutto quello che dovete fare è scrivere %%timeit all'inizio di una cella, quindi è il più facile da usare.