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

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


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


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 .


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.


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

4

Sie können einfach den Unterschied ausdrucken:

print tend - tstart

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.


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.


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.


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

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'

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.