当前位置:嗨网首页>书籍在线阅读

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_cachemaxsize 属性表示对所装饰的函数最多应该缓存多少次最近的调用结果,如果将其设置为 None 就表示没有限制。