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 是一个用于提高函数性能的工具,特别适合那些计算开销大、输入参数重复的函数。通过缓存最近使用的函数结果,避免重复计算,从而加快程序的执行速度。

posted @ 2025-03-12 10:01  劉半仙  阅读(211)  评论(0)    收藏  举报