2013-10-06 24 views
1

我想用Python代碼來測量函數的CPU運行時間和掛鐘運行時間。如何使用資源模塊來測量函數的運行時間?

資源模塊在這裏建議:How to measure CPU running time and wall clock running time of a function, separately, as Python code (not from terminal)?

這裏是模塊文檔:http://docs.python.org/2/library/resource.html

的問題是:

1)我無法弄清楚如何用它來衡量函數的運行時間。

2)我不知道如何從返回的對象中提取信息。

我該怎麼做?

+3

在你想要的時間之前和之後調用'getrusage()'。減去您關心的相應字段以獲得經過的差異。這些字段可以通過索引('result [0]',1,2,...,'result [15]')或者用最近足夠的Python - 通過屬性訪問('result.ru_utime'等) 。檢查以確保您的系統提供您需要的精度。毫秒和微秒的分辨率,我認爲最常見。 –

回答

5

只需在執行該功能之前和之後調用getrusage,減去您關心的字段,即可完成。由於resource沒有掛牆時間,因此您需要使用單獨的功能。

你可以用,最多的一個輔助功能,甚至是裝飾,是這樣的:

import datetime 
import functools 
import resource 
import sys 

def timed(func): 
    @functools.wraps(func) 
    def wrapper(*args, **kwargs): 
     r0 = resource.getrusage(resource.RUSAGE_SELF) 
     t0 = datetime.datetime.now() 
     retval = func(*args, **kwargs) 
     r = resource.getrusage(resource.RUSAGE_SELF) 
     t = datetime.datetime.now() 
     sys.stderr.write('{}: utime {} stime {} wall: {}\n'.format(
      func.__name__, 
      datetime.timedelta(seconds=r.ru_utime-r0.ru_utime), 
      datetime.timedelta(seconds=r.ru_stime-r0.ru_stime), 
      t-t0)) 
     return retval 
    return wrapper 

@timed 
def myfunc(i): 
    for _ in range(100000000): 
     pass 
    return i*2 

print(myfunc(2)) 

這將打印出像:

myfunc: utime 0:00:03.261688 stime 0:00:00.805324 wall 0:00:04.067109 
4 

如果你想比一對夫婦更多字段,你可能想要減去所有的rusage結果的成員,但是因爲這些都是int或float,所以很容易:

rdiff = resource.struct_rusage(f1-f0 for f0, f1 in zip(r0, r)) 
sys.stderr.write('{}: utime {} maxrss {} nsignals {} etc.\n'.format(
    datetime.timedelta(seconds=rdiff.r_utime), 
    rdiff.ru_maxrss, 
    rdiff.ru_nsignals)) 
相關問題