1
我想用Python代碼來測量函數的CPU運行時間和掛鐘運行時間。如何使用資源模塊來測量函數的運行時間?
這裏是模塊文檔:http://docs.python.org/2/library/resource.html
的問題是:
1)我無法弄清楚如何用它來衡量函數的運行時間。
2)我不知道如何從返回的對象中提取信息。
我該怎麼做?
我想用Python代碼來測量函數的CPU運行時間和掛鐘運行時間。如何使用資源模塊來測量函數的運行時間?
這裏是模塊文檔:http://docs.python.org/2/library/resource.html
的問題是:
1)我無法弄清楚如何用它來衡量函數的運行時間。
2)我不知道如何從返回的對象中提取信息。
我該怎麼做?
只需在執行該功能之前和之後調用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))
在你想要的時間之前和之後調用'getrusage()'。減去您關心的相應字段以獲得經過的差異。這些字段可以通過索引('result [0]',1,2,...,'result [15]')或者用最近足夠的Python - 通過屬性訪問('result.ru_utime'等) 。檢查以確保您的系統提供您需要的精度。毫秒和微秒的分辨率,我認爲最常見。 –