2009-04-19 5 views
91

Was ist der richtige Weg, um 2 mal in Python zu vergleichen, um einen Codeabschnitt zu beschleunigen? Ich habe versucht, die API-Dokumente zu lesen. Ich bin mir nicht sicher, ob ich das Timedelta verstehe.Python Geschwindigkeit testen - Zeitunterschied - Millisekunden

Bisher habe ich diesen Code:

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

Warum Sie t2-t1 nicht drucken? Was hat dich davon abgehalten, zu subtrahieren? –

+16

Ich denke, ich hatte den Moment "Es könnte nicht so einfach sein". – BuddyJoe

Antwort

130

datetime.timedelta ist nur die Differenz zwischen zwei Datetimes ... so ist es wie eine Zeitdauer in Tagen/Sekunde/Mikrosekunden

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

Beachten Sie, dass c.microseconds nur die Mikrosekunde Teil des Timedeltas zurück! Verwenden Sie für Timing-Zwecke immer c.total_seconds().

Sie können alle Arten von Mathe mit datetime.timedelta tun, zum Beispiel:

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

Es könnte nützlich sein, um CPU-Zeit, obwohl statt Wanduhr Zeit zu schauen ... dass das Betriebssystem allerdings abhängig .. Unter Unix-ähnlichen Systemen sollten Sie den 'time'-Befehl ausprobieren.

+0

Jeder, der sich für die Gesamtminuten interessiert, kann 'int (c.total_seconds()/60)' in diesem Fall verwenden – sufinawaz

+1

Die [Seite für das Modul timeit] (http://docs.python.org/library/timeit.html) sagt, dass das Modul "eine Anzahl von allgemeinen Fallen vermeidet, um Ausführungszeiten zu messen". Ist dieser Ansatz (unter Verwendung von datetime.now) einer dieser Fallstricke ausgesetzt? – kuzzooroo

3

Sie einfach den Unterschied drucken konnten:

print tend - tstart 
0

Ich bin kein Python-Programmierer, aber I do know how to use Google und hier ist was ich gefunden: Sie nutzen die "-" Operator. Um Ihren Code:

from datetime import datetime 

tstart = datetime.now() 

# code to speed test 

tend = datetime.now() 
print tend - tstart 

Außerdem sieht es so aus, wie Sie die Funktion strftime() können Sie die Zeitspanne Berechnung, um zu formatieren, die Zeit jedoch zu machen dich glücklich macht.

+0

siehe zweiten Kommentar auf der Frageebene. – BuddyJoe

+0

Bester Kommentar, den ich seit Ewigkeiten gesehen habe. –

+3

"aber ich weiß, wie man Google benutzt" - anscheinend wissen Sie nicht, wie man Stack Overflow verwendet, weil der ganze Zweck dieser Website darin besteht, Programmierfragen korrekt und auf den Punkt zu stellen, nicht darüber zu reden, wie "du es stattdessen hätte ansehen können". – Hejazzman

2

Der folgende Code sollte sich die Zeit Detla anzuzeigen ...

from datetime import datetime 

tstart = datetime.now() 

# code to speed test 

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

time.time()/Datumzeit ist für den schnellen Einsatz gut, aber nicht immer 100% genau. Aus diesem Grund benutze ich gerne eine der Standard-Lib profilers (besonders Hotshot), um herauszufinden, was was ist.

18

Sie könnten auch verwenden:

import time 

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

Oder Sie python profilers nutzen könnten.

2

Vielleicht möchten Sie in die profile Module schauen. Sie werden besser darüber informiert, wo Ihre Verlangsamungen sind, und ein großer Teil Ihrer Arbeit wird automatisch erledigt.

0

könnten Sie timeit wie diese verwenden, um ein Skript namens module.py

$ python -mtimeit -s 'import module' 
8

Ich weiß, das Ende zu testen, aber ich wirklich wirklich wie mit:

start = time.time() 

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

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

time.time() gibt Ihnen Sekunden seit die Epoche. Da dies eine standardisierte Zeit in Sekunden ist, können Sie die Startzeit einfach von der Endzeit subtrahieren, um die Prozesszeit (in Sekunden) zu erhalten.time.clock() ist gut für Benchmarking, aber ich habe es als nutzlos, wenn Sie wissen möchten, wie lange Ihr Prozess dauerte. Zum Beispiel, es ist viel intuitiver zu sagen, „mein Vorgang dauert 10 Sekunden“, als es zu sagen ist über

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

Im ersten Beispiel „mein Prozess 10 Prozessor-Takteinheiten dauert“, werden Sie eine Zeit von 0,05 gezeigt für time.clock() vs 0,06377 für 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 

im zweiten Beispiel, irgendwie die Prozessorzeit „0“ zeigt, obwohl der Prozess für eine Sekunde geschlafen. time.time() zeigt korrekt etwas mehr als 1 Sekunde an.

36

Seit Python 2.7 gibt es die Methode timedelta.total_seconds(). Also, um die verstrichene Millisekunden zu erhalten:

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

Hier ist eine benutzerdefinierte Funktion, die/Oktaves der Matlab tictoc Funktionen imitieren.

Beispiel:

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

Funktion:

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