2013-03-29 18 views
52

Chciałbym zmierzyć czas, który upłynął, aby ocenić blok kodu w programie Python, , prawdopodobnie rozdzielając czas procesora użytkownika, czas procesora i czas, który upłynął.Uzyskaj czas wykonania bloku kodu w Pythonie 2.7

Znam moduł timeit, ale mam wiele funkcji napisanych samodzielnie i nie jest to łatwe , aby przekazać je w procesie instalacji.

wolałbym mieć coś, co można by wykorzystać jak:

#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 

Czasy CPU użytkownika i systemowe nie są niezbędne (choć chciałbym je zmierzyć), ale dla upływu czasu chciałbym aby móc zrobić coś takiego, zamiast używać skomplikowanych poleceń lub modułów.

Odpowiedz

122

Aby uzyskać czas, który upłynął w sekundach, można użyć timeit.default_timer():

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

timeit.default_timer() jest używany zamiast time.time() lub time.clock() ponieważ będzie wybrać funkcję pomiaru czasu, który ma wyższą rozdzielczość dla każdej platformy.

+1

Czytałem, że nie jest to najlepsze podejście do bloków kodu, które trwają ułamek sekundy. Również myślę, że przy korzystaniu z modułu czasu preferowana jest metoda .clock()? http://stackoverflow.com/questions/85451/python-time-clock-vs-time-time-accuracy – lucacerone

+1

Zmieniono moją odpowiedź na użycie 'timeit.default_timer()', która wybierze między 'time.time()' lub 'time.clock()' w zależności od tego, która ma wyższą rozdzielczość na używanej platformie. –

+0

dzięki, default_timer() wydaje się lepsze. Porady na tej stronie również wydają się bardzo ładne! http://www.huyng.com/posts/python-performance-analysis/ – lucacerone

15

Zawsze używam dekoratora do wykonania dodatkowej pracy dla istniejącej funkcji, w tym do uzyskania czasu wykonania. Jest pytoniczny i prosty.

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

Przykro mi, nadal nie wiem jak używać dekoratorów :( – lucacerone

+4

@ LucaCerone istnieje doskonałe wyjaśnienie dekoracji http: // stackoverflow .com/questions/739654/understanding-python-decorators. Staraj się czytać go cierpliwie i zrozumiesz dekoratora. – Yarkee

+0

dzięki temu jest naprawdę interesujący post! – lucacerone

7

Można to osiągnąć poprzez Menedżera Context, na przykład: Przykład

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) 

zastosowanie:

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

Powinien to być "przedrostek", a nie "nazwa elementu", w ostatnim wierszu. –

+0

@GeorgePetrov Dzięki, poprawiłem to. – monklof

6

znalazłem się rozwiązać ten problem raz po raz, więc w końcu stworzył do tego jest library. Zainstaluj za pomocą pip install timer_cm. Następnie:

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) 

wyjściowa:

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

pozornie istotne pytanie, które podniosłem: https://stackoverflow.com/questions/48260833/make-a-child-of-a-timer-cm-timer-object-in-a-called-function – lurix66

+0

Działa wspaniale, z wyjątkiem literówka ("Timer importu" ---> "Timer importu") i brakujący pakiet ("czas importu") – user3768495

+0

Sheesh. Masz rację. Poprawiłem moją odpowiedź. –

0

Jest jeszcze jedna opcja którą uwielbia dużo teraz dla uproszczenia - ipython. W ipython masz wiele przydatnych rzeczy Plus:

%time <expression> - aby uzyskać prostą procesora i ściany razem na ekspresję

%timeit <expression> - aby uzyskać procesora i ściany razem w pętli wypowiedzi