Python-Geschwindigkeitstest - Zeitunterschied - Millisekunden

136

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

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
BuddyJoe
quelle
15
Warum hast du nicht t2-t1 gedruckt? Was hat Sie davon abgehalten, zu subtrahieren?
S.Lott
18
Ich schätze, ich hatte den Moment "es könnte nicht so einfach sein".
BuddyJoe

Antworten:

190

datetime.timedelta ist nur der Unterschied zwischen zwei Datumsangaben ... es ist also wie ein Zeitraum in Tagen / Sekunden / Mikrosekunden

>>> 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.microsecondsBeachten Sie, dass nur der Mikrosekunden-Teil des Zeitdeltas zurückgegeben wird! Für Timing-Zwecke immer verwenden c.total_seconds().

Mit datetime.timedelta können Sie alle Arten von Mathematik ausführen, z.

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

Es könnte jedoch sinnvoller sein, die CPU-Zeit anstelle der Wanduhrzeit zu betrachten. Dies ist jedoch betriebssystemabhängig. Überprüfen Sie unter Unix-ähnlichen Systemen den Befehl 'time'.

NickZoic
quelle
Jeder, der daran interessiert ist, Gesamtminuten zu erhalten, kann int(c.total_seconds() / 60)in diesem Fall
Sufinawaz
2
Auf der Seite für das timeit-Modul heißt es, dass das Modul "eine Reihe gängiger Traps zur Messung der Ausführungszeiten vermeidet". Unterliegt dieser Ansatz (unter Verwendung von datetime.now) einer dieser Fallstricke?
kuzzooroo
@kuzzooroo ja, das ist es! Es ist besser, timeit anstelle dieser Methode zu verwenden! Zum Beispiel habe ich einen Test in einem großen Python-Projekt, der bei Messung mit dieser Methode zu einer angenommenen Laufzeit von 0,25 Sekunden führt. In der Realität und laut Zeitangabe beträgt die Laufzeit dieser Funktion tatsächlich 30 Sekunden!
Kazaamjt
62

Seit Python 2.7 gibt es die Methode timedelta.total_seconds (). Um die verstrichenen 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
f.cipriani
quelle
20

Sie könnten auch verwenden:

import time

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

Oder Sie können die Python-Profiler verwenden .

Zitrax
quelle
1
Bei Verwendung start = time.clock()wird gedruckt 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

Ich weiß, dass dies spät ist, aber ich benutze es wirklich sehr gerne:

import time
start = time.time()

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

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

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

>>> 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 oben wird eine Zeit von 0,05 für time.clock () gegenüber 0,06377 für time.time () angezeigt.

>>> 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 zeigt die Prozessorzeit irgendwie "0" an, obwohl der Prozess eine Sekunde lang geschlafen hat. time.time()zeigt etwas mehr als 1 Sekunde korrekt an.

mgoldwasser
quelle
NameError: Name 'Zeit' ist nicht definiert
Joe
Sie benötigen die import timeErklärung
mgoldwasser
5

Der folgende Code sollte die Zeit anzeigen ...

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart
killy971
quelle
4

Sie können einfach den Unterschied ausdrucken:

print tend - tstart
etw
quelle
4

Ich bin kein Python-Programmierer, aber ich weiß, wie man Google verwendet, und ich habe Folgendes gefunden: Sie verwenden den Operator "-". So vervollständigen Sie Ihren Code:

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart

Es sieht außerdem so aus, als könnten Sie die Funktion strftime () verwenden, um die Zeitspannenberechnung zu formatieren, um die Zeit zu rendern, was Sie jedoch glücklich macht.

Mike C.
quelle
siehe zweiten Kommentar auf Fragenebene.
BuddyJoe
14
"aber ich weiß, wie man Google benutzt" - anscheinend wissen Sie jedoch nicht, wie man Stack Overflow benutzt, weil der ganze Zweck dieser Website darin besteht, dass Leute Programmierfragen richtig und auf den Punkt stellen und nicht beantworten Snark darüber zu geben, wie "du es stattdessen hätte goggled" können.
Hejazzman
2

time.time () / datetime ist gut für den schnellen Gebrauch, aber nicht immer 100% genau. Aus diesem Grund verwende ich gerne einen der Standard-Lib- Profiler (insbesondere Hotshot), um herauszufinden, was was ist.

Nilamo
quelle
2

Sie können in die aussehen wollen Profil Module. Sie können besser ablesen, wo sich Ihre Verlangsamungen befinden, und ein Großteil Ihrer Arbeit wird vollständig automatisiert.

Stefan Kendall
quelle
2

Hier ist eine benutzerdefinierte Funktion, die die Funktionen von Matlab / Octave tic tocnachahmt.

Anwendungsbeispiel:

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()
Ulad Kasach
quelle
Traceback (letzter Aufruf zuletzt): Datei "redis-get-response.py", Zeile 22, in <module> time_var = time_me (); # Holen Sie sich eine Variable mit dem aktuellen Zeitstempel Datei "redis-get-response.py", Zeile 20, in time_me return time.time () NameError: Name 'Zeit' ist nicht definiert
Joe
0

Sie können timeit wie dieses verwenden, um ein Skript mit dem Namen module.py zu testen

$ python -mtimeit -s 'import module'
Dhiraj Thakur
quelle
0

Pfeil: Bessere Daten und Zeiten für 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
Eds_k
quelle