2009-08-10 14 views
14

Quando eseguo il codice di seguito al di fuori di timeit(), sembra che venga completato istantaneamente. Tuttavia, quando lo eseguo all'interno della funzione timeit(), ci vuole molto più tempo. Perché?python: funzione timeit slow()

>>> import timeit 
>>> t = timeit.Timer("3**4**5") 
>>> t.timeit() 
16.55522028637718 

Usando: Python 3.1 (x86) - AMD Athlon 64 X2 - WinXP (32 bit)

+0

Paging Alex Martelli, Alex Martelli, per favore commenta il modulo python timeit ... – hughdbrown

+0

RichieHindle ha già capito bene mentre ero offline. E, io uso sempre "python -mtimeit" comunque, mai timeit all'interno dell'interprete interattivo o di un programma ;-) –

risposta

26

La funzione timeit() esegue il codice più volte (default un milione) e prende una media di i tempi.

Per eseguire il codice solo una volta, fare questo:

t.timeit(1) 

ma che vi darà la distorsione dei risultati - ripete per una buona ragione.

Per ottenere il tempo di per-loop dopo averlo lasciato ripetere, dividere il risultato per il numero di cicli. Utilizzare un valore più piccolo per il numero di ripetizioni, se un milione è di troppo:

count = 1000 
print t.timeit(count)/count 
+6

Sì! Raccomando anche di usare 'python -mtimeit' da una riga di comando invece di timeit come modulo - la versione da riga di comando ha troppe piccole cose pratiche che non si ottengono dal modulo (ripetendo un numero variabile di volte a seconda di come lento/veloce è quello che stai misurando, ad esempio: una grande tecnica di microbenchmarking, peccato che il modulo non lo offra - etc, etc ;-). –

+0

@Alex Il tuo commento qui non mi è chiaro. Puoi chiarire quali funzionalità extra sono disponibili sulla CLI. – Tshepang

+1

@Tshepang: l'uso CLI di timeit preleva il numero di ripetizioni "magicamente": poche per il codice lento misurato, più per il codice più veloce, molto per il codice molto veloce: precisione e tempo di bilanciamento ben bilanciati per ottenere risultati. –

6

Perché timeit default per farlo funzionare un milione di volte. Il punto è fare micro-benchmark e l'unico modo per ottenere tempi precisi di eventi brevi è ripeterli molte volte.

3

In base allo docs, Timer.timeit() esegue il codice un milione di volte per impostazione predefinita. Utilizzare il parametro "numero" per modificare questo valore predefinito:

t.timeit(number=100) 

per esempio.

2

Timeit viene eseguito per un milione di loop per impostazione predefinita.

È inoltre possibile che si riscontrino problemi di ordine operativo: (3**4)**5 != 3**4**5.

+0

Grazie a tutti. Molto utile. E sì, quello era l'ordine previsto delle operazioni. –