2010-02-11 25 views
25

Potrzebuję mieć klasę podstawową podstawową klasę, której użyję do dziedziczenia innych klas, które chciałbym zmierzyć czas wykonania jego funkcji.jak zmierzyć czas wykonania funkcji (automatycznie) w Pythonie

Więc intead mając coś takiego:

class Worker(): 
    def doSomething(self): 
     start = time.time() 
     ... do something 
     elapsed = (time.time() - start) 
     print "doSomething() took ", elapsed, " time to finish" 

#outputs: doSomething() took XX time to finish 

chciałbym mieć coś takiego:

class Worker(BaseClass): 
    def doSomething(self): 
     ... do something 

#outputs the same: doSomething() took XX time to finish 

Więc klasy bazowej musi czynienia z czasu

+2

Proponuję dekoratora klas zamiast implementacji taktowania w BaseClass. – MattH

+3

Dlaczego po prostu nie używać profilera, takiego jak cProfiler, kiedy chcesz poznać czasy? –

+0

@Justin cProfiler jest dobry, ale potrzebowałem wiedzieć o czasy za każdym razem, aby je zgłosić. – pars

Odpowiedz

44

Jednym ze sposobów, aby to zrobić, będzie użycie dekoratora (PEP for decorators)(first of a series of tutorial articles on decorators). Oto przykład, który robi to, co chcesz.

from functools import wraps 
from time import time 

def timed(f): 
    @wraps(f) 
    def wrapper(*args, **kwds): 
    start = time() 
    result = f(*args, **kwds) 
    elapsed = time() - start 
    print "%s took %d time to finish" % (f.__name__, elapsed) 
    return result 
    return wrapper 

To jest przykład jego wykorzystania

@timed 
def somefunction(countto): 
    for i in xrange(countto): 
    pass 
    return "Done" 

Aby pokazać jak to działa zadzwoniłem funkcji z wiersza Pythona:

>>> timedec.somefunction(10000000) 
somefunction took 0 time to finish 
'Done' 
>>> timedec.somefunction(100000000) 
somefunction took 2 time to finish 
'Done' 
>>> timedec.somefunction(1000000000) 
somefunction took 22 time to finish 
'Done' 
+0

Dziękuję za wspaniałą odpowiedź! właśnie tego szukałem. – pars

+0

Świetny przykład czystego kodu, aby pokazać, jak dekoratorzy są jedną z najlepszych radości w Pythonie –

+0

co to jest timedec ??! –

9

pomiaru Czy sprawdziłeś numer "profile" module?

tj. czy na pewno chcesz zaimplementować własne niestandardowe środowisko zamiast używać domyślnego mechanizmu profilowania dla tego języka?

Można również użyć google "python hotshot" dla podobnego rozwiązania.

+0

+1 do profilowania. – Khelben

5

Istnieje również timeit, która jest częścią standardowej biblioteki i jest naprawdę łatwy w użyciu. Pamiętaj: nie wynajduj ponownie koła!

+0

Rzeczywiście bardzo prosty i łatwy w użyciu! –

+0

timeit wydaje się obiecujący! Połączę to z rozwiązaniem Geoffa. – pars

+0

https://twitter.com/davidjbland/status/634059970699358208 – rebeling

Powiązane problemy