In Java können wir also die Zeit messen, die eine Funktion zur Ausführung benötigt
Aber wie geht das in Python? Um die Start- und Endzeit zwischen Codezeilen zu messen? Etwas, das dies tut:
import some_time_library
starttime = some_time_library.some_module()
code_tobe_measured()
endtime = some_time_library.some_module()
time_taken = endtime - starttime
time.clock()
undtime.clock()
misst die CPU-Zeit unter Unix, sondern die Wandzeit unter Windows. Es ist besser zu verwenden,time.time()
wenn das Verhalten nicht mit dem Betriebssystem variiert. stackoverflow.com/questions/85451/…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
# your code here
mittime.sleep(10)
und bekam 0,0 Sekunden. Das Hinzufügenfor i in range(10000):/pass
ergab die gleichen Ergebnisse. Unter allen Umständen habe ich versucht,time.process_time()
immer die gleiche Nummer zurückzugeben. Ich habe erwartet , dass die Resultate mit demtime.perf_counter()
obwohlSie können auch die
time
Bibliothek verwenden:import time start = time.time() # your code # end print(f'Time: {time.time() - start}')
quelle
Mithilfe einer kleinen Convenience-Klasse können Sie die Zeit messen , die Sie in eingerückten Zeilen wie folgt verbringen :
with CodeTimer(): line_to_measure() another_line() # etc...
Nach Abschluss der Ausführung der eingerückten Zeile (n) wird Folgendes angezeigt:
UPDATE: Sie können jetzt die Klasse mit
pip install linetimer
und dann bekommenfrom linetimer import CodeTimer
. Siehe dieses GitHub-Projekt .Der Code für die obige Klasse:
import timeit class CodeTimer: def __init__(self, name=None): self.name = " '" + name + "'" if name else '' def __enter__(self): self.start = timeit.default_timer() def __exit__(self, exc_type, exc_value, traceback): self.took = (timeit.default_timer() - self.start) * 1000.0 print('Code block' + self.name + ' took: ' + str(self.took) + ' ms')
Sie können dann die Codeblöcke benennen, die Sie messen möchten:
with CodeTimer('loop 1'): for i in range(100000): pass with CodeTimer('loop 2'): for i in range(100000): pass Code block 'loop 1' took: 4.991 ms Code block 'loop 2' took: 3.666 ms
Und niste sie:
with CodeTimer('Outer'): for i in range(100000): pass with CodeTimer('Inner'): for i in range(100000): pass for i in range(100000): pass Code block 'Inner' took: 2.382 ms Code block 'Outer' took: 10.466 ms
In dieser Antwort
timeit.default_timer()
wird der beste Timer verwendet, der auf dem Betriebssystem und der Python-Version basiert .quelle
Ich bevorzuge es immer, die Zeit in Stunden, Minuten und Sekunden (% H:% M:% S) zu überprüfen:
from datetime import datetime start = datetime.now() # your code end = datetime.now() time_taken = end - start print('Time: ',time_taken)
Ausgabe:
Time: 0:00:00.000019
quelle
Ich suchte nach einer Möglichkeit, eine formatierte Zeit mit minimalem Code auszugeben. Hier ist meine Lösung. Viele Leute verwenden Pandas sowieso, so dass in einigen Fällen zusätzliche Bibliotheksimporte vermieden werden können.
import pandas as pd start = pd.Timestamp.now() # code print(pd.Timestamp.now()-start)
Ausgabe:
0 days 00:05:32.541600
Ich würde empfehlen, dies zu verwenden, wenn die Zeitgenauigkeit nicht am wichtigsten ist, andernfalls verwenden Sie die
time
Bibliothek:%timeit pd.Timestamp.now()
gibt 3,29 µs ± 214 ns pro Schleife aus%timeit time.time()
gibt 154 ns ± 13,3 ns pro Schleife ausquelle
Sie können dies auch versuchen:
from time import perf_counter t0 = perf_counter() ... t1 = perf_counter() time_taken = t1 - t0
quelle
Eine weitere Option besteht darin, den Code in eine Funktion einzufügen und dann einen Dekorator für das Timing zu verwenden. ( Quelle ) Der Vorteil dieser Methode ist, dass Sie den Timer einmal definieren und ihn mit einer einfachen zusätzlichen Zeile für jede Funktion verwenden.
Definieren Sie zunächst den
timer
Dekorateur:import functools import time def timer(func): @functools.wraps(func) def wrapper(*args, **kwargs): start_time = time.perf_counter() value = func(*args, **kwargs) end_time = time.perf_counter() run_time = end_time - start_time print("Finished {} in {} secs".format(repr(func.__name__), round(run_time, 3))) return value return wrapper
Verwenden Sie dann den Dekorator, während Sie die Funktion definieren:
@timer def doubled_and_add(num): res = sum([i*2 for i in range(num)]) print("Result : {}".format(res))
Lass es uns versuchen:
doubled_and_add(100000) doubled_and_add(1000000)
Ausgabe:
Result : 9999900000 Finished 'doubled_and_add' in 0.0119 secs Result : 999999000000 Finished 'doubled_and_add' in 0.0897 secs
Hinweis: Ich bin mir nicht sicher, warum ich
time.perf_counter
stattdessen verwenden solltime.time
. Kommentare sind willkommen.quelle