【发布时间】:2019-04-13 09:44:18
【问题描述】:
我有一个简单的装饰器来跟踪函数调用的运行时间:
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)
这将给出结果和时间的元组,但我希望所有这些都由装饰器处理,这样调用者就不必担心为每次调用定义一个新函数。想法?
【问题讨论】:
-
你可能可以通过使用
sys._getframe来实现你想要的,但这是CPython 的一个实现细节,所以它并不是抽象python 语言的一部分。而且它可能会很慢。
标签: python python-3.x recursion python-decorators