2010-02-11 72 views
25

我需要有一個基類,我將使用它來繼承我想測量其函數執行時間的其他類。如何在Python中自動測量函數的執行時間

因此,有這樣的事情這一翻譯的

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 

我想有這樣的事情:

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

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

所以BaseClass的需要處理的測量時間

+2

我會建議一個類裝飾器,而不是在BaseClass中實現時間。 – MattH 2010-02-11 14:48:45

+3

爲什麼不只是使用像cProfiler這樣的分析器,只要你想知道時間? – 2010-02-11 14:49:41

+0

@Justin cProfiler很好,但我需要知道的是每次都要報告時間。 – pars 2010-02-11 16:01:56

回答

44

要做到這一點的一種方法是與裝飾者(PEP for decorators)(first of a series of tutorial articles on decorators)。這是一個可以做你想做的事情的例子。

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 

這是它的使用

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

的一個例子來說明它是如何工作的,我從Python提示符調用的函數:

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

謝謝你的偉大答案!這正是我所期待的。 – pars 2010-02-11 16:02:55

+0

乾淨的代碼很好的例子,顯示如何裝飾是Python中最好的樂趣之一 – 2013-05-02 21:22:59

+0

什麼是timedec ??! – 2013-09-06 16:02:27

9

你有沒有檢查過"profile" module

I.e.您確定需要實現自己的自定義框架,而不是使用該語言的默認分析機制嗎?

你也可以谷歌的「python hotshot」爲類似的解決方案。

+0

用於分析。 – Khelben 2010-02-11 15:40:13

5

還有timeit,這是部分的標準庫,並且非常易於使用。記住:不要重新發明輪子!

+0

確實非常簡單和易於使用! – 2010-02-11 15:15:06

+0

時間似乎很有希望!我將結合Geoff的解決方案。 – pars 2010-02-11 16:04:27

+0

https://twitter.com/davidjbland/status/634059970699358208 – rebeling 2015-10-03 20:30:58