python中lru_cache的用法

215 阅读2分钟

在 Python 中,functools.lru_cache 是一个非常有用的装饰器,用于实现一个简单的缓存机制。它可以存储最近被调用的函数的结果,并在下次带有同样参数的调用发生时,直接返回缓存的结果,而不是重新计算。这在处理耗时的函数调用时特别有用。

如何使用 lru_cache

  1. 导入:首先,你需要从 functools 模块导入 lru_cache

  2. 应用装饰器:然后,将 @lru_cache 装饰器应用于你想要缓存其结果的函数。

  3. 可选参数

    • 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 是一个强大的工具,能够通过缓存结果来优化函数的性能。它特别适用于那些具有重复计算的函数,例如递归函数。通过简单地添加一个装饰器,你可以显著提高函数的执行效率。