我想撰寫一個裝飾器來計算函式的運行時間,該函式計算斐波那契數 5(fib(5)) 10 次,并列印一個中等運行時間值。但是我的裝飾器回傳一個錯誤。如何解決這個問題?
import functools
import time
def trace(times):
def cache(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
total = 0
for i in range(times):
start = time.time()
func(*args, **kwargs)
end = time.time()
total = (end - start)
print('Medium value is {}'.format(total / times))
return func
return wrapper
return cache
@trace(times=10)
def fib(num):
if num < 2:
return num
return fib(num - 1) fib(num - 2)
fib(5)
uj5u.com熱心網友回復:
首先,不是func在wrapperreturn 中回傳它的結果。
我們必須確保跟蹤只發生在第一次呼叫fib而不是遞回呼叫。讓我們使用一個布爾traced引數:
import functools
import time
def trace(times):
def cache(func):
@functools.wraps(func)
def wrapper(*args, traced=True, **kwargs):
if not traced:
return func(*args, **kwargs)
total = 0
for i in range(times):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
total = (end - start)
print(f'run {i}, time is {total}')
print(f'Mean value is {total / times}')
return result
return wrapper
return cache
@trace(times=10)
def fib(num, traced=True):
if num < 2:
return num
return fib(num - 1, traced=False) fib(num - 2, traced=False)
fib(5)
traced默認情況True下,任何呼叫都fib(n)將被跟蹤(用戶無需知道traced引數)。然而,遞回呼叫都有,traced=False因此它們不會觸發裝飾器中的回圈。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/448940.html
標籤:Python python-3.x 功能 递归 装饰师
上一篇:如何避免遞回或解決問題?
