functools.lru_cache
functools.lru_cache 是 Python 标准库 functools 中的一个装饰器,用于缓存函数的结果,以提高性能,特别是对于那些调用频繁且具有相同输入参数的函数。
什么是 LRU Cache?
LRU 是 Least Recently Used(最少使用)的缩写。LRU 缓存会保存函数的返回结果,最多缓存指定数量的最近使用过的结果。当缓存达到最大限制时,最久未使用的结果会被丢弃,以腾出空间存储新的计算结果。
使用 lru_cache
1. 基本用法
from functools import lru_cache
@lru_cache(maxsize=128)
def expensive_function(x):
print(f"Calculating {x}...")
return x * x
在这个例子中,expensive_function 是一个假设的计算开销较大的函数。通过使用 @lru_cache(maxsize=128) 装饰器,Python 会缓存最多 128 次的函数调用结果。当相同的输入参数再次传递给该函数时,Python 会直接返回缓存中的结果,而不是重新计算。
2. 缓存工作原理
- 第一次调用
expensive_function(4)时,函数会计算并返回16,并将结果缓存。 - 第二次调用
expensive_function(4)时,Python 会直接返回缓存中的结果,而不再执行计算。 - 如果你调用了
expensive_function(5),它会被计算并缓存,依此类推。
3. maxsize 参数
maxsize参数决定了缓存的最大大小。如果缓存已满,最久未使用的结果将会被丢弃。- 如果设置为
None,缓存将没有大小限制,直到内存耗尽。 - 默认情况下,
maxsize=128。
4. 示例:性能优化
from functools import lru_cache
@lru_cache(maxsize=3)
def fib(n):
if n <= 1:
return n
return fib(n - 1) + fib(n - 2)
# 计算 Fibonacci 数列
print(fib(10)) # 会缓存一些计算结果
对于 Fibonacci 数列,计算时会重复很多相同的调用。例如,fib(5) 会被计算多次,通过 lru_cache 可以缓存中间计算结果,大大减少计算的时间。
5. 检查缓存状态
你可以查看缓存的状态,使用 cache_info() 方法查看缓存的统计信息(缓存命中、丢弃等)。
print(fib.cache_info())
输出将包括:
hits:缓存命中的次数。misses:缓存未命中的次数。maxsize:缓存的最大大小。currsize:当前缓存的大小。
6. 清空缓存
如果你想清空缓存,可以使用 cache_clear() 方法。
fib.cache_clear() # 清空缓存
总结
functools.lru_cache 是一个用于提高函数性能的工具,特别适合那些计算开销大、输入参数重复的函数。通过缓存最近使用的函数结果,避免重复计算,从而加快程序的执行速度。

浙公网安备 33010602011771号