2013-03-29 3 views
52

Ich möchte die verstrichene Zeit messen, um einen Code-Block in einem Python-Programm möglicherweise zwischen Benutzer CPU-Zeit, System-CPU-Zeit und verstrichene Zeit zu unterscheiden.Get Zeit der Ausführung eines Blocks von Code in Python 2.7

Ich kenne das timeit Modul, aber ich habe viele selbstgeschriebene Funktionen und es ist nicht sehr einfach , sie im Setup-Prozess zu übergeben.

Ich würde lieber etwas, das wie verwendet werden könnten:

#up to here I have done something.... 
start_counting() #or whatever command used to mark that I want to measure 
        #the time elapsed in the next rows 
# code I want to evaluate 
user,system,elapsed = stop_counting() #or whatever command says: 
             #stop the timer and return the times 

Die Benutzer- und System-CPU-Zeiten nicht wesentlich sind (obwohl ich sie messen möchte), aber für die verstrichene Zeit würde ich gerne in der Lage sein, etwas zu tun, anstatt komplizierte Befehle oder Module zu verwenden.

Antwort

122

Um die verstrichene Zeit in Sekunden zu erhalten, können Sie timeit.default_timer() verwenden:

import timeit 
start_time = timeit.default_timer() 
# code you want to evaluate 
elapsed = timeit.default_timer() - start_time 

timeit.default_timer() verwendet wird anstelle von time.time() oder time.clock(), weil sie die Timing-Funktion wählen wird, die die höhere Auflösung für jede Plattform hat.

+1

ich gelesen habe, dass Dies ist nicht der beste Ansatz für Code-Blöcke, die nur einen Bruchteil einer Sekunde benötigen. Auch ich denke, dass mit dem Zeitmodul die .clock() Methode bevorzugt wird? http://stackoverflow.com/questions/85451/python-time-clock-vs-timetime-accuracy – lucacerone

+1

Meine Antwort geändert, um 'timeeit.default_timer()' zu verwenden, die zwischen 'time.time()' wählen wird oder 'time.clock()' abhängig davon, welche höhere Auflösung auf der von Ihnen verwendeten Plattform vorliegt. –

+0

danke, default_timer() scheint besser. Die Hinweise auf dieser Seite scheinen auch sehr nett zu sein! http://www.huyng.com/posts/python-performance-analysis/ – lucacerone

15

Ich verwende immer einen Dekorator, um einige zusätzliche Arbeit für eine vorhandene Funktion zu tun, einschließlich der Ausführungszeit. Es ist pythonisch und einfach.

import time 

def time_usage(func): 
    def wrapper(*args, **kwargs): 
     beg_ts = time.time() 
     retval = func(*args, **kwargs) 
     end_ts = time.time() 
     print("elapsed time: %f" % (end_ts - beg_ts)) 
     return retval 
    return wrapper 

@time_usage 
def test(): 
    for i in xrange(0, 10000): 
     pass 

if __name__ == "__main__": 
    test() 
+2

Es tut mir leid, ich weiß immer noch nicht, wie man Dekorateure verwendet :( – lucacerone

+4

@LucaCerone gibt es eine ausgezeichnete Erklärung über Dekoration http: // stackoverflow .com/questions/739654/Python-Dekoratoren zu verstehen. Versuchen Sie, es geduldig zu lesen, und Sie werden Dekorateur verstehen. – Yarkee

+0

danke es ist ein wirklich interessanter Beitrag! – lucacerone

7

Sie können dies durch den Context Manager erreichen zum Beispiel:

from contextlib import contextmanager 
import time 
import logging 
@contextmanager 
def _log_time_usage(prefix=""): 
    '''log the time usage in a code block 
    prefix: the prefix text to show 
    ''' 
    start = time.time() 
    try: 
     yield 
    finally: 
     end = time.time() 
     elapsed_seconds = float("%.2f" % (end - start)) 
     logging.debug('%s: elapsed seconds: %s', prefix, elapsed_seconds) 

Anwendungsbeispiel:

with _log_time_usage("sleep 1: "): 
    time.sleep(1) 
+0

In der letzten Zeile sollte 'prefix', nicht' item_name' stehen. –

+0

@GeorgePetrov Danke, ich habe es korrigiert. – monklof

6

fand ich mich dieses Problem immer wieder zu lösen, so dass ich schließlich erstellt a library dafür. Installieren Sie mit pip install timer_cm. Dann:

from time import sleep 
from timer_cm import Timer 

with Timer('Long task') as timer: 
    with timer.child('First step'): 
     sleep(1) 
    for _ in range(5): 
     with timer.child('Baby steps'): 
      sleep(.5) 

Ausgang:

Long task: 3.520s 
    Baby steps: 2.518s (71%) 
    First step: 1.001s (28%) 
+0

eine scheinbar relevante Frage, die ich angesprochen habe: https://stackoverflow.com/questions/48260833/make-a-child-of-a-timer-cm-timer-object-in-a-called-function – lurix66

+0

Funktioniert gut, außer ein Tippfehler ('Import-Timer' ---> 'Import-Timer') und ein fehlendes Paket ('Import-Zeit') – user3768495

+0

Sheesh. Du hast recht. Ich habe meine Antwort korrigiert. –

0

Es gibt eine weitere Option, die ich sehr mag jetzt der Einfachheit halber - ipython. In IPython bekam man eine Menge nützlicher Sachen Plus:

%time <expression> -

%timeit <expression> gerade cpu und Wand Zeit Ausdruck zu bekommen - cpu und Wand Zeit in einer Schleife des Ausdrucks zu erhalten