Python 如何使用资源模块测量函数的运行时间?

Python 如何使用资源模块测量函数的运行时间?,python,performance,Python,Performance,我想使用Python代码测量函数的CPU运行时间和挂钟运行时间 此处建议使用资源模块: 以下是模块文档: 问题在于: 1) 我不知道如何使用它来测量函数的运行时间 2) 我不知道如何从返回的对象中提取信息 我该怎么做?只需在执行函数之前和之后调用,减去您关心的字段,就完成了。由于resource不执行墙时间,因此需要使用一个单独的函数 您可以将其封装在助手函数中,甚至可以封装在装饰器中,如下所示: import datetime import functools import resource

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

此处建议使用资源模块:

以下是模块文档:

问题在于:

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

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

我该怎么做?

只需在执行函数之前和之后调用,减去您关心的字段,就完成了。由于
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]
)提取,也可以通过属性访问(
result.ru_-utime
)提取。检查以确保您的系统提供所需的精度。我认为毫秒和微秒的分辨率是最常见的。