在 Python 中,functools.lru_cache 是一个非常有用的装饰器,用于实现一个简单的缓存机制。它可以存储最近被调用的函数的结果,并在下次带有同样参数的调用发生时,直接返回缓存的结果,而不是重新计算。这在处理耗时的函数调用时特别有用。
如何使用 lru_cache
-
导入:首先,你需要从
functools模块导入lru_cache。 -
应用装饰器:然后,将
@lru_cache装饰器应用于你想要缓存其结果的函数。 -
可选参数:
maxsize:定义缓存的最大大小。设置为None代表无限制。默认值为 128。typed:如果设置为True,则不同类型的函数参数将被视为不同的调用,即使它们的值相同。默认为False。
示例代码
下面的例子展示了如何使用 lru_cache 来缓存一个计算斐波那契数列的函数的结果:
from functools import lru_cache
@lru_cache(maxsize=100)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
# 调用函数
print(fib(10)) # 第一次调用,结果会被计算并缓存
print(fib(10)) # 第二次调用,结果会从缓存中获取,不需要重新计算
在这个例子中,fib 函数用于计算斐波那契数列。由于斐波那契数列的计算是递归的,没有缓存的话,相同的值会被多次计算,导致效率低下。使用 lru_cache,我们可以显著提高函数的执行效率,特别是对于已经计算过的值。
查看缓存信息
lru_cache 还提供了一些有用的属性和方法,例如:
cache_info():返回一个包含缓存命中次数、缓存未命中次数、缓存的当前大小和缓存的最大大小的命名元组。cache_clear():清空缓存。
print(fib.cache_info()) # 查看缓存信息
fib.cache_clear() # 清空缓存
总结
lru_cache 是一个强大的工具,能够通过缓存结果来优化函数的性能。它特别适用于那些具有重复计算的函数,例如递归函数。通过简单地添加一个装饰器,你可以显著提高函数的执行效率。