Python标准库中的functools.lru_cache是一个用于函数结果缓存的装饰器,它能将最近调用的参数与返回值保存起来,当再次以相同参数调用函数时直接返回缓存内容,避免重复计算。对于递归、重复查询或计算密集型函数,合理使用lru_cache能显著降低执行时间。

lru_cache基础用法
使用lru_cache非常简单,只需从functools导入并用它装饰目标函数。以下示例展示了一个普通斐波那契函数的优化方式:
from functools import lru_cache
@lru_cache(maxsize=128)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
print(fib(50))
未加缓存时,fib(50)会产生大量重复递归调用;加上lru_cache后,中间结果被记住,速度提升明显。
核心参数说明
lru_cache主要包含两个常用参数:
- maxsize:缓存最大条目数,设为None表示无限制,但会占用更多内存。
- typed:若为True,则区分参数类型,例如1和1.0会被视为不同缓存键。
| 参数 | 默认值 | 作用 |
|---|---|---|
| maxsize | 128 | 控制缓存容量,LRU策略淘汰旧数据 |
| typed | False | 是否按类型分别缓存 |
查看缓存状态
被装饰的函数会附带几个有用方法,便于观察命中情况:
print(fib.cache_info()) fib.cache_clear()
cache_info()返回命中次数、未命中次数等信息,cache_clear()用于清空缓存。
使用注意事项
并非所有函数都适合加缓存。以下情况需谨慎:
- 函数参数必须是可哈希的,列表等不可哈希类型无法直接作为缓存键。
- 函数结果应相对稳定,避免缓存了随时间变化的数据。
- 高并发写入场景需注意线程安全,lru_cache本身对单函数读多写少较友好。
合理设置maxsize,在性能与内存之间取得平衡,是函数缓存优化的关键。
简单性能对比示例
import time
from functools import lru_cache
def slow_add(a, b):
time.sleep(0.01)
return a + b
@lru_cache(maxsize=32)
def cached_add(a, b):
time.sleep(0.01)
return a + b
start = time.time()
for _ in range(100):
slow_add(1, 2)
print("无缓存:", time.time() - start)
start = time.time()
for _ in range(100):
cached_add(1, 2)
print("有缓存:", time.time() - start)
上述代码中,无缓存版本每次都睡眠0.01秒,总耗时约1秒;有缓存版本首次计算后直接命中,总耗时仅约0.01秒,差异非常直观。