我想使用Python代码测量函数的CPU运行时间和挂钟运行时间。
以下是模块文档:http://docs.python.org/2/library/resource.html
问题在于:
1)我无法弄清楚如何使用它来衡量一个功能的运行时间。
2)我不知道如何从返回的对象中提取该信息。
我该怎么做?
答案 0 :(得分:6)
在执行该功能之前和之后调用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))