10.10 timeit -- Misurare il tempo di esecuzione di piccole porzioni di codice

Nuovo nella versione 2.3.

Questo modulo offre un modo semplice per calcolare il tempo impiegato nell'esecuzione di piccole parti di codice Python. Può essere utilizzato da riga di comando o tramite interfacce richiamabili. Aggira un certo numero di trappole comuni nella misurazione del tempo di esecuzione. Vedete anche l'introduzione di Tim Peters al capitolo ``Algoritmi'', nel Python Cookbook, pubblicato dalla O'Reilly.

Il modulo definisce la seguente classe pubblica:

class Timer( [stmt='pass' [, setup='pass' [, timer=<timer function>]]])
Classe per calcolare la velocità di esecuzione di piccole porzioni di codice.

Il costruttore richiede come primo argomento un'istruzione da misurare, un'ulteriore istruzione da usare per il setup, ed una funzione timer. Il valore predefinito per i primi due argomenti è 'pass'; la funzione timer è dipendente dalla piattaforma (vedete la stringa di documentazione del modulo). Le istruzioni possono contenere dei caratteri di fine riga, anche se magari non contengono caratteri di continuazione riga.

Per misurare il tempo di esecuzione della prima istruzione, usate il metodo timeit(). Il metodo repeat() invece è utile per chiamare più volte il metodo timeit(), restituendo quindi una lista di risultati.

print_exc( [file=None])
Permette di stampare una traceback del codice analizzato.

Utilizzo tipico:

    t = Timer(...)       # fuori dal try/except
    try:
        t.timeit(...)    # oppure t.repeat(...)
    except:
        t.print_exc()

Il vantaggio di questa funzione è quello di poter stampare le informazioni sugli eventuali errori verificatisi. L'argomento facoltativo file indica dove redirigere la stampa della traceback; la redirezione predefinita è su sys.stderr.

repeat( [repeat=3 [, number=1000000]])
Chiama più volte la funzione timeit().

Questa è una funzione di comodità che chiama timeit() ripetutamente, restituendo una lista di tutti i risultati. Il primo argomento specifica quante volte chiamare timeit(). Il secondo specifica l'argomento number da passare a timeit().

Note: Si può essere tentati di calcolare e riportare la media e la deviazione standard dalla lista ottenuta. Tuttavia, fare questo non è molto utile. In un caso tipico, il valore più basso indica il limite inferiore della velocità con cui la macchina può eseguire il codice fornito; i valori più alti non sono causati da una qualche variabilità della velocità di Python nell'eseguire il codice, ma dall'interferenza di altri processi nella precisione della vostra misurazione. Così il min() del risultato è il solo valore a cui dovreste essere interessati. Alla fin fine comunque, è meglio dare un'occhiata all'intera lista ed applicare il buon senso piuttosto che le leggi della probabilità statistica.

timeit( [number=1000000])
Calcola il tempo impiegato per eseguire number esecuzioni dell'istruzione principale. Il codice di setup viene eseguito una sola volta, il metodo poi restituisce come numero in virgola mobile il tempo impiegato per eseguire l'istruzione principale il numero dato di volte, misurato in secondi. L'argomento è il numero di volte in cui effettuare il ciclo, il cui valore predefinito è un milione. L'istruzione principale, quella di setup e la funzione timer da usare vengono passate al costruttore.

Note: Di predefinito, timeit() temporaneamente inibisce il funzionamento della garbage collection durante il calcolo del tempo. Il vantaggio di questo approccio consiste nella maggior possibilità di comparare calcoli del tempo indipendenti. Lo svantaggio è che la GC può avere un ruolo fondamentale nelle prestazioni di questa funzione. Se è questo il caso, la GC può venire riabilitata come prima istruzione nella stringa setup. Per esempio:
    timeit.Timer('for i in xrange(10): oct(i)', 'gc.enable()').timeit()



Subsections
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.