06-自动化的结果缓存
1.1.4 自动化的结果缓存
还可以对 fib3() 做进一步的简化。Python自带了一个内置的装饰器(decorator),可以自动为任何函数缓存结果。如代码清单1-7所示,在 fib4() 中,装饰器 @functools.lru_cache() 所用的代码与 fib2() 中所用的代码完全相同。每次用新的参数执行 fib4() 时,该装饰器就会把返回值缓存起来。以后再用相同的参数调用 fib4() 时,都会从缓存中读取该参数对应的 fib4() 之前的返回值并返回。
代码清单1-7 fib4.py
from functools import lru_cache
@lru_cache(maxsize=None)
def fib4(n: int) -> int: # same definition as fib2()
if n < 2: # base case
return n
return fib4(n - 2) + fib4(n - 1) # recursive case
if __name__ == "__main__":
print(fib4(5))
print(fib4(50))
注意,虽然以上斐波那契函数体部分与 fib2() 中的函数体部分相同,但能立刻计算出 fib4(50) 的结果。 @lru_cache 的 maxsize 属性表示对所装饰的函数最多应该缓存多少次最近的调用结果,如果将其设置为 None 就表示没有限制。