Test di velocità Python - Differenza di tempo - millisecondi


136

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 timedelta.

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

15
Perché non hai stampato t2-t1? Cosa ti ha impedito di sottrarre?
S.Lott

18
Immagino, ho avuto il momento "non potrebbe essere così facile".
BuddyJoe,

Risposte:


191

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

>>> import datetime
>>> 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

c.microsecondsRicorda che restituisce solo la parte in microsecondi di timedelta! Ai fini della sincronizzazione, utilizzare sempre c.total_seconds().

Puoi fare tutti i tipi di matematica con datetime.timedelta, ad esempio:

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

Potrebbe essere più utile guardare il tempo della CPU invece del tempo del wallclock sebbene ... questo dipende dal sistema operativo ... nei sistemi simili a Unix, controlla il comando 'time'.


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

2
Il pagina per il modulo timeit dice che il modulo "evita un numero di trappole comuni per misurare i tempi di esecuzione". Questo approccio (usando datetime.now) è soggetto a una di queste insidie?
Kuzzooroo,

@kuzzooroo sì, lo è! Sarebbe meglio usare timeit invece di questo metodo! Ad esempio, ho un test in un grande progetto Python che, quando misurato usando questo metodo, si traduce in un tempo di esecuzione presunto di 0,25 secondi. In realtà, e secondo timeit, l'autonomia di detta funzione è in realtà di 30 secondi!
kazaamjt,

62

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


20

Puoi anche usare:

import time

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

Oppure potresti usare i profiler di Python .


1
Quando lo si utilizza start = time.clock()stampa DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead.
Contango,

16

So che è tardi, ma in realtà mi piace molto usare:

import time
start = time.time()

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

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

time.time()ti dà secondi dall'epoca. Poiché si tratta di un tempo standardizzato in secondi, è possibile sottrarre semplicemente l'ora di inizio dall'ora di fine per ottenere il tempo di processo (in secondi). time.clock()è buono per il benchmarking, ma l'ho trovato un po 'inutile se vuoi sapere quanto tempo ha impiegato il processo. Ad esempio, è molto più intuitivo dire "il mio processo richiede 10 secondi" piuttosto che dire "il mio processo richiede 10 unità di clock del processore"

>>> 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 sopra, viene mostrato un tempo di 0,05 per time.clock () contro 0,06377 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 del processore mostra "0" anche se il processo ha dormito per un secondo. time.time()mostra correttamente poco più di 1 secondo.


NameError: il nome 'time' non è definito
Joe

È necessaria la import timedichiarazione
mgoldwasser

5

Il codice seguente dovrebbe visualizzare l'ora detla ...

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart

4

Potresti semplicemente stampare la differenza:

print tend - tstart

4

Non sono un programmatore Python, ma so come usare Google ed ecco cosa ho trovato: usi l'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 tu possa usare la funzione strftime () per formattare il calcolo del periodo di tempo in modo da rendere il tempo che ti rende felice.


vedere il secondo commento a livello di domanda.
BuddyJoe,

15
"ma io so come usare Google" - apparentemente, però, non sai come usare Stack Overflow, perché lo scopo di questo sito Web è far sì che le persone facciano domande e rispondano a domande di programmazione correttamente e fino al punto, non per dare una smorfia su come "avresti potuto farlo invece con Goggl".
Hejazzman,

2

time.time () / datetime è utile per un uso rapido, ma non è sempre preciso al 100%. Per questo motivo, mi piace usare uno dei profiler di std lib (specialmente hotshot) per scoprire cosa.


2

Potresti voler esaminare i moduli del profilo . Otterrai una migliore lettura di dove sono i tuoi rallentamenti e gran parte del tuo lavoro sarà completamente automatizzato.


2

Ecco una funzione personalizzata che imita le funzioni di Matlab / Octave tic toc.

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()

Traceback (ultima chiamata più recente): file "redis-get-response.py", linea 22, in <module> time_var = time_me (); # ottieni una variabile con il file timestamp corrente "redis-get-response.py", riga 20, in time_me return time.time () NameError: nome 'time' non definito
Joe

0

È possibile utilizzare timeit in questo modo per testare uno script chiamato module.py

$ python -mtimeit -s 'import module'

0

Arrow: date e orari migliori per Python

import arrow
start_time = arrow.utcnow()
end_time = arrow.utcnow()
(end_time - start_time).total_seconds()  # senconds
(end_time - start_time).total_seconds() * 1000  # milliseconds
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.