2009-04-19 8 views
91

Qual è il modo corretto di confrontare 2 volte in Python per velocizzare il test di una sezione di codice? Ho provato a leggere i documenti API. Non sono sicuro di aver capito la cosa di timedelta.Test velocità Python - Differenza oraria - millisecondi

Finora ho questo codice:

from datetime import datetime 

tstart = datetime.now() 
print t1 

# code to speed test 

tend = datetime.now() 
print t2 
# what am I missing? 
# I'd like to print the time diff here 
+12

Perché non si stampa t2-t1? Cosa ti ha impedito di sottrarre? –

+16

Indovina, ho avuto il momento "non poteva essere così facile". – BuddyJoe

risposta

130

datetime.timedelta è solo la differenza tra due datetimes ... quindi è come un periodo di tempo, in giorni/secondi/microsecondi

>>> a = datetime.datetime.now() 
>>> b = datetime.datetime.now() 
>>> c = b - a 

>>> c 
datetime.timedelta(0, 4, 316543) 
>>> c.days 
0 
>>> c.seconds 
4 
>>> c.microseconds 
316543 

Essere consapevoli che c.microseconds restituisce solo la parte microsecondi del timedelta! Per gli scopi di temporizzazione utilizzare sempre c.total_seconds().

Si può fare ogni sorta di matematica con datetime.timedelta, ad esempio:

>>> c/10 
datetime.timedelta(0, 0, 431654) 

Potrebbe essere più utile guardare il tempo di CPU al posto di tempo wallclock però ... che il sistema di operativo dipende però .. sotto sistemi simil-Unix, controlla il comando 'tempo'.

+0

Chiunque sia interessato a ottenere i minuti totali può usare 'int (c.total_seconds()/60)' in questo caso – sufinawaz

+1

La [pagina per il modulo timeit] (http://docs.python.org/library/timeit.html) dice che il modulo "evita un numero di trap comuni per misurare i tempi di esecuzione". Questo approccio (usando datetime.now) è soggetto a una di queste insidie? – kuzzooroo

3

Si potrebbe semplicemente stampare la differenza:

print tend - tstart 
0

Io non sono un programmatore Python, ma I do know how to use Google ed ecco cosa ho trovato: si utilizza il "-" operatore. Per completare il tuo codice:

from datetime import datetime 

tstart = datetime.now() 

# code to speed test 

tend = datetime.now() 
print tend - tstart 

Inoltre, sembra che è possibile utilizzare la funzione strftime() per formattare il calcolo periodo, al fine di rendere il tempo però ti rende felice.

+0

vedi il secondo commento al livello di domanda. – BuddyJoe

+0

Miglior commento che ho visto da secoli. –

+3

"ma so come usare Google" - a quanto pare, non si sa come usare Stack Overflow, perché l'intero scopo di questo sito Web è che le persone chiedano e rispondano correttamente alle domande di programmazione e fino al punto, per non dare fastidio a come "potresti averlo fatto invece a Goggled". – Hejazzman

2

Il seguente codice dovrebbe visualizzare il Detla tempo ...

from datetime import datetime 

tstart = datetime.now() 

# code to speed test 

tend = datetime.now() 
print tend - tstart 
2

time.time()/datetime è un bene per un utilizzo rapido, ma è preciso non sempre al 100%. Per questo motivo, mi piace utilizzare uno dei lib st2 profilers (specialmente hotshot) per scoprire cosa è cosa.

18

Si potrebbe anche usare:

import time 

start = time.clock() 
do_something() 
end = time.clock() 
print "%.2gs" % (end-start) 

Oppure si potrebbe usare il python profilers.

2

Si consiglia di esaminare i moduli profile. Otterrai una lettura migliore di dove sono i tuoi rallentamenti e gran parte del tuo lavoro sarà automatizzato.

0

si potrebbe usare timeit come questo per testare uno script chiamato module.py

$ python -mtimeit -s 'import module' 
8

So che questo è in ritardo, ma io in realtà piace molto utilizzare:

start = time.time() 

##### your timed code here ... ##### 

print "Process time: " + (time.time() - start) 

time.time() ti dà secondi dal l'epoca. Poiché si tratta di un tempo standardizzato in secondi, è sufficiente sottrarre l'ora di inizio dall'ora di fine per ottenere il tempo di elaborazione (in secondi).time.clock() è un ottimo strumento per il benchmarking, ma l'ho trovato praticamente inutile se si desidera sapere quanto tempo ha impiegato il processo. Ad esempio, è molto più intuitivo da dire "il mio processo richiede 10 secondi" di quello che è a dire "il mio processo richiede processore 10 unità di clock"

>>> start = time.time(); sum([each**8.3 for each in range(1,100000)]) ; print (time.time() - start) 
3.4001404476250935e+45 
0.0637760162354 
>>> start = time.clock(); sum([each**8.3 for each in range(1,100000)]) ; print (time.clock() - start) 
3.4001404476250935e+45 
0.05 

Nel primo esempio di cui sopra, si sono mostrati un tempo di 0,05 per time.clock() vs 0,06,377 mila per time.time()

>>> start = time.clock(); time.sleep(1) ; print "process time: " + (time.clock() - start) 
process time: 0.0 
>>> start = time.time(); time.sleep(1) ; print "process time: " + (time.time() - start) 
process time: 1.00111794472 

Nel secondo esempio, in qualche modo il tempo processore indica "0" anche se il processo dormiva per un secondo. time.time() mostra correttamente un po 'più di 1 secondo.

36

Da Python 2.7 esiste il metodo timedelta.total_seconds(). Quindi, per ottenere i millisecondi trascorsi:

>>> import datetime 
>>> a = datetime.datetime.now() 
>>> b = datetime.datetime.now() 
>>> delta = b - a 
>>> print delta 
0:00:05.077263 
>>> int(delta.total_seconds() * 1000) # milliseconds 
5077 
1

Ecco una funzione personalizzata tictoc funzioni della/Octave di Matlab di che imitano.

Esempio di utilizzo:

time_var = time_me(); # get a variable with the current timestamp 

... run operation ... 

time_me(time_var); # print the time difference (e.g. '5 seconds 821.12314 ms') 

Funzione:

def time_me(*arg): 
    if len(arg) != 0: 
     elapsedTime = time.time() - arg[0]; 
     #print(elapsedTime); 
     hours = math.floor(elapsedTime/(60*60)) 
     elapsedTime = elapsedTime - hours * (60*60); 
     minutes = math.floor(elapsedTime/60) 
     elapsedTime = elapsedTime - minutes * (60); 
     seconds = math.floor(elapsedTime); 
     elapsedTime = elapsedTime - seconds; 
     ms = elapsedTime * 1000; 
     if(hours != 0): 
      print ("%d hours %d minutes %d seconds" % (hours, minutes, seconds)) 
     elif(minutes != 0): 
      print ("%d minutes %d seconds" % (minutes, seconds)) 
     else : 
      print ("%d seconds %f ms" % (seconds, ms)) 
    else: 
     #print ('does not exist. here you go.'); 
     return time.time() 
Problemi correlati