2

我想使用 Python 代码测量函数的 CPU 运行时间和挂钟运行时间。

这里建议了资源模块:如何分别测量函数的 CPU 运行时间和挂钟运行时间,作为 Python 代码(不是来自终端)?

这是模块文档:http ://docs.python.org/2/library/resource.html

问题是:

1)我不知道如何用它来测量函数的运行时间。

2) 我不知道如何从返回的对象中提取该信息。

我该怎么做呢?

4

1 回答 1

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))
于 2013-10-06T03:12:25.083 回答