上一篇:闭包
functools.lru_cache(maxsize=128, typed=False)
该函数是一个装饰器,为函数提供缓存功能。在下次以相同参数调用时直接返回上一次的结果
例如生成第 n
个斐波纳契数这种慢速递归函数适合使用 lru_cache
import datetime
def fibonacci(n):
"""斐波那契函数"""
if n < 2:
return n
return fibonacci(n - 2) + fibonacci(n - 1)
if __name__ == '__main__':
print(fibonacci(34)) # 没有使用缓存,则需要几秒钟的时间
如果没有使用缓存,则需要几秒钟的时间,像下面这样使用缓存后,瞬间就可以计算出结果。
import datetime
from functools import lru_cache
@lru_cache(maxsize=300)
def fibonacci(n):
"""斐波那契函数"""
if n < 2:
return n
return fibonacci(n - 2) + fibonacci(n - 1)
如果使用了lru_cache
,计算用时被大大减少。这是因为我们在使用fibonacci
递归函数时,会重复计算值。使用了lru_cache
后,所有的重复计算只会执行一次。
注意事项
-
缓存
是按照第一个参数作为键。
from functools import lru_cache
@lru_cache(maxsize=100)
def my_sum(a, b):
print('执行计算')
return a + b
if __name__ == '__main__':
t1 = my_sum(1, 2)
print(t1)
t2 = my_sum(1, 2)
print(t2)
执行计算
3
3
上面的函数使用了lru_cache
缓存,所以只打印一次执行计算
if __name__ == '__main__':
t1 = my_sum(1, 2)
print(t1)
t2 = my_sum(2, 1)
print(t2)
像下面这样,第一个参数改变了,所以需要重新缓存
执行计算
3
执行计算
3
- 2.缓存实际是存储在字典中,所以只能第一个必须可哈希
hash
from functools import lru_cache
@lru_cache(maxsize=100)
def list_sum(nums: list):
return sum(nums)
上述函数无法使用缓存,会报错
TypeError: unhashable type: 'list'