Python中functools.lru_cache高效缓存机制详解与实战
一、缓存机制的核心价值
在计算密集型应用中,重复计算相同参数会导致性能瓶颈。Python的functools.lru_cache
装饰器通过最近最少使用(Least Recently Used)算法自动缓存函数结果,显著提升程序执行效率。
二、lru_cache核心参数解析
@lru_cache(maxsize=128, typed=False)
- maxsize:缓存容量(默认128),设置为None则不限制大小
- typed:是否区分参数类型(默认False),如1和1.0视为相同
三、斐波那契数列优化案例
传统递归实现存在指数级时间复杂度:
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
使用lru_cache优化后:
from functools import lru_cache
@lru_cache(maxsize=None)
def fib_optimized(n):
if n < 2:
return n
return fib_optimized(n-1) + fib_optimized(n-2)
性能对比(计算fib(35)):
- 原始版本:约5秒
- 优化版本:约0.0001秒
四、Web请求缓存实战
import requests
from functools import lru_cache
import time
@lru_cache(maxsize=32)
def get_api_data(user_id):
print(f"实际请求API: {user_id}")
response = requests.get(f"https://api.example.com/users/{user_id}")
return response.json()
# 测试调用
start = time.time()
print(get_api_data(1)) # 实际请求
print(get_api_data(1)) # 命中缓存
print(f"耗时:{time.time()-start:.4f}秒")
输出结果:
实际请求API: 1 {"name": "张三", "age": 28} {"name": "张三", "age": 28} 耗时:0.1234秒
五、缓存失效策略
当需要强制刷新缓存时,可通过cache_clear()
方法:
fib_optimized.cache_clear() # 清空缓存
get_api_data.cache_clear()
六、注意事项
- 缓存的函数参数必须是可哈希的
- 内存敏感场景需合理设置maxsize
- 动态变化的数据源需谨慎使用
- 可通过
cache_info()
查看缓存命中率