Misura il tempo di elaborazione con il modulo timeit di Python.

Attività commerciale

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.