我有一个简单的装饰器来跟踪函数调用的运行时:
def timed(f):
def caller(*args):
start = time.time()
res = f(*args)
end = time.time()
return res, end - start
return caller
可以按如下方式使用,并返回函数结果和执行时间的元组。
@timed
def test(n):
for _ in range(n):
pass
return 0
print(test(900)) # prints (0, 2.69e-05)
够简单的。但现在我想将其应用于递归函数。正如预期的那样,将上述包装器应用于递归函数会产生带有每次递归调用时间的嵌套元组。
@timed
def rec(n):
if n:
return rec(n - 1)
else:
return 0
print(rec(3)) # Prints ((((0, 1.90e-06), 8.10e-06), 1.28e-05), 1.90e-05)
编写装饰器以使其正确处理递归的优雅方法是什么?显然,如果是定时函数,您可以包装调用:
@timed
def wrapper():
return rec(3)
这将给出结果和时间的元组,但我希望所有这些都由装饰器处理,以便调用者不需要担心为每个调用定义一个新函数。有想法吗?