【计时方法】二、装饰器

time.time() 的使用很快会让代码变得乱七八糟,一个稍微干净一点的方法是使用装饰器——在需要调查的函数上面增加一行代码。我们先编写一个简单的装饰器:

import time
from functools import wraps

def timefn(fn):
    @wraps(fn)
    def measure_time(*args, **kwargs):
        t1 = time.perf_counter()
        result = fn(*args, **kwargs)
        t2 = time.perf_counter()
        print("【计时装饰器】:" + fn.__name__ + " 用时 " + str(t2 -t1) + " 秒")
        return result
    return measure_time

在这个例子中,我们定义了一个新函数 timefn,它以一个函数 fn 为参数。它的内嵌函数 measure_time 接受 *args(数量可变的位置参数)以及 **kwargs(数量可变的键值对参数)等参数并将其传入 fn 执行。在执行 fn 前后,我们抓取 time.time()并将结果打印出来。我们用 @wraps(fn) 将函数名和 docstring 暴露给 fn 的调用者(否则调用者看到的将是装饰器自身的函数名和 docstring,而不是被装饰的函数的)。

需要调查某个函数的运行时间时,直接在函数上面增加一行 @timefn 即可,例如:

@timefn
def somefunc():
    ...