Frage
Ich versuche nur zu Zeit ein Stück Code. Der Pseudo-Code wie folgt aussieht:
start = get_ticks()
do_long_code()
print "It took " + (get_ticks() - start) + " seconds."
Wie sieht dies in Python?
Genauer gesagt, wie kann ich die Anzahl der Ticks seit Mitternacht bekommen (oder aber Python organisiert, dass Timing)?
Lösung
Im time
Modul gibt es zwei Zeitfunktionen: time
und clock
. time
gibt Ihnen „Wand“ Zeit, wenn das ist, was Ihnen wichtig sind.
Allerdings ist die Python docs sagen, dass clock
sollte für das Benchmarking verwendet werden. Beachten Sie, dass clock
anders in getrennten Systemen verhält:
- auf MS Windows, verwendet es die Win32-Funktion Queryperformancecounter (), mit „Auflösung der Regel besser als eine Mikrosekunde“. Es hat keine besondere Bedeutung, es ist nur eine Zahl (es beginnt das erste Mal Zählen Sie
clock
in Ihrem Prozess nennen).
# ms windows t0= time.clock() do_something() t= time.clock() - t0 # t is wall seconds elapsed (floating point)
- auf * nichts,
clock
meldet CPU-Zeit. Nun, dies ist anders, und wahrscheinlich der Wert, den Sie wollen, da das Programm so gut wie nie der einzige Prozess ist CPU-Zeit anfordert (auch wenn Sie keine anderen Prozesse haben, verwendet die Kernel-CPU-Zeit von Zeit zu Zeit). Also, diese Zahl ist, die typischerweise smaller¹ als die Wand Zeit (das heißt time.time () - t0), ist sinnvoller, wenn der Code Benchmarking:
# linux t0= time.clock() do_something() t= time.clock() - t0 # t is CPU seconds elapsed (floating point)
Neben all dem, das timeit Modul hat die Timer
Klasse, die ist sollte verwenden, was das beste aus den verfügbaren Funktionen für das Benchmarking.
¹, es sei denn Einfädeln in die Quere kommt ...
² Python ≥3.3: Es gibt time.perf_counter()
und time.process_time()
. perf_counter
wird durch das timeit
Modul verwendet wird.
Andere Tipps
Was Sie brauchen, ist time()
Funktion von time
Modul:
import time
start = time.time()
do_long_code()
print "it took", time.time() - start, "seconds."
Sie können mit timeit Modul für mehr Optionen though.
Hier ist eine Lösung, die ich vor kurzem begonnen mit:
class Timer:
def __enter__(self):
self.begin = now()
def __exit__(self, type, value, traceback):
print(format_delta(self.begin, now()))
Sie nutzen es so (Sie müssen mindestens Python 2.5):
with Timer():
do_long_code()
Wenn Ihr Code beendet, Timer druckt automatisch die Laufzeit aus. Süss! Wenn ich zu schnell Bank etwas in der Python-Interpreter versucht, ist dies der einfachste Weg zu gehen.
Und hier ist ein Beispiel-Implementierung von ‚jetzt‘ und ‚format_delta‘, obwohl sich bitte an Ihren bevorzugten Timing und Formatierungsmethode zu verwenden.
import datetime
def now():
return datetime.datetime.now()
# Prints one of the following formats*:
# 1.58 days
# 2.98 hours
# 9.28 minutes # Not actually added yet, oops.
# 5.60 seconds
# 790 milliseconds
# *Except I prefer abbreviated formats, so I print d,h,m,s, or ms.
def format_delta(start,end):
# Time in microseconds
one_day = 86400000000
one_hour = 3600000000
one_second = 1000000
one_millisecond = 1000
delta = end - start
build_time_us = delta.microseconds + delta.seconds * one_second + delta.days * one_day
days = 0
while build_time_us > one_day:
build_time_us -= one_day
days += 1
if days > 0:
time_str = "%.2fd" % ( days + build_time_us / float(one_day) )
else:
hours = 0
while build_time_us > one_hour:
build_time_us -= one_hour
hours += 1
if hours > 0:
time_str = "%.2fh" % ( hours + build_time_us / float(one_hour) )
else:
seconds = 0
while build_time_us > one_second:
build_time_us -= one_second
seconds += 1
if seconds > 0:
time_str = "%.2fs" % ( seconds + build_time_us / float(one_second) )
else:
ms = 0
while build_time_us > one_millisecond:
build_time_us -= one_millisecond
ms += 1
time_str = "%.2fms" % ( ms + build_time_us / float(one_millisecond) )
return time_str
Bitte lassen Sie mich wissen, wenn Sie eine bevorzugte Formatierungsmethode haben, oder wenn es einen einfacheren Weg, um all dies zu tun!
Die Zeitmodul in Python rel="nofollow können Sie auf die Uhr zugreifen () Funktion, die Zeit in Sekunden als Gleitkomma- zurückkehrt.
Verschiedene Systeme unterschiedliche Genauigkeit auf der Grundlage ihrer internen Uhr Setup haben (Ticks pro Sekunde), aber es ist in der Regel zumindest unter 20milliseconds, und in einigen Fällen besser als ein paar Mikrosekunden.
-Adam
import datetime
start = datetime.datetime.now()
do_long_code()
finish = datetime.datetime.now()
delta = finish - start
print delta.seconds
Von Mitternacht:
import datetime
midnight = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
now = datetime.datetime.now()
delta = now - midnight
print delta.seconds
Wenn Sie viele Aussagen haben Sie Zeit möchten, können Sie so etwas wie diese verwenden:
class Ticker:
def __init__(self):
self.t = clock()
def __call__(self):
dt = clock() - self.t
self.t = clock()
return 1000 * dt
Dann könnte Ihr Code wie folgt aussehen:
tick = Ticker()
# first command
print('first took {}ms'.format(tick())
# second group of commands
print('second took {}ms'.format(tick())
# third group of commands
print('third took {}ms'.format(tick())
Auf diese Weise brauchen Sie nicht t = time()
vor jedem Block und 1000 * (time() - t)
, nachdem es zu geben, während immer noch die Kontrolle über die Formatierung zu halten (obwohl man leicht, dass in Ticket
setzen könnte auch).
Es ist ein minimaler Gewinn, aber ich denke, es ist eine Art bequem.