Wie messe ich die Zeit zwischen Codezeilen in Python?


Antworten:


149

Wenn Sie die CPU-Zeit messen möchten, können Sie time.process_time()Python 3.3 und höher verwenden:

import time
start = time.process_time()
# your code here    
print(time.process_time() - start)

Der erste Anruf schaltet den Timer ein und der zweite Anruf zeigt an, wie viele Sekunden vergangen sind.

Es gibt auch eine Funktion time.clock(), die jedoch seit Python 3.3 veraltet ist und in Python 3.8 entfernt wird.

Es gibt bessere Profiling-Tools wie timeitund profilejedoch misst time.process_time () die CPU-Zeit und das ist es, wonach Sie fragen.

Wenn Sie stattdessen die Wanduhrzeit messen möchten, verwenden Sie time.time().


52
Dies ist nicht Ihre Verwendung time.clock()und time.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/…
Tim

4
Gute Beobachtung, @Tim. Ein anderer Beitrag zu derselben Frage zitiert jedoch Python doc auf time.clock (), dass "dies die Funktion ist, die zum Benchmarking von Python- oder Timing-Algorithmen verwendet werden soll". Ich denke, es geht um die Frage, was Sie tatsächlich messen möchten.
Jewgen Jampolskiy

1
Eine sehr schlechte Sache bei time.time () ist, dass es durch Zeitsunchronisierung ntpdate usw. beeinflusst wird. Ich würde sagen, time.clock () wäre aus diesem
Grund

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

2
Hmmm ... ich bin mir nicht sicher, was ich falsch mache. Ich ersetzte # your code heremit time.sleep(10)und bekam 0,0 Sekunden. Das Hinzufügen for i in range(10000):/passergab 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 dem time.perf_counter()obwohl
biscuit314

56

Sie können auch die timeBibliothek verwenden:

import time

start = time.time()

# your code

# end

print(f'Time: {time.time() - start}')

1
@Hayat - Diese Methode gibt die Zeit als Gleitkommazahl in Sekunden seit der Epoche in UTC zurück. [ docs.python.org/3/library/time.html]
Anumoy Sutradhar

@AnumoySutradhar nicht wirklich, da es eine Epoche von einer Epoche subtrahiert, erhalten Sie den Zeitunterschied zwischen den beiden Zeiten.
Nasta

28

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:

Code block took: x.xxx ms

UPDATE: Sie können jetzt die Klasse mit pip install linetimerund dann bekommen from 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 Antworttimeit.default_timer() wird der beste Timer verwendet, der auf dem Betriebssystem und der Python-Version basiert .


9

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

3

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

%timeit pd.Timestamp.now() gibt 3,29 µs ± 214 ns pro Schleife aus

%timeit time.time() gibt 154 ns ± 13,3 ns pro Schleife aus


1

Sie können dies auch versuchen:

from time import perf_counter

t0 = perf_counter()

...

t1 = perf_counter()
time_taken = t1 - t0

1

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

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_counterstattdessen verwenden soll time.time. Kommentare sind willkommen.

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.