Python中functools.lru_cache的深度解析与性能优化实战
一、lru_cache的核心原理
functools.lru_cache是Python标准库提供的装饰器,实现最近最少使用(LRU)缓存策略。其核心特点包括:
- 自动缓存函数调用结果
- 默认缓存128个最近结果(可自定义)
- 基于参数哈希值建立缓存键
- 线程安全实现
from functools import lru_cache
@lru_cache(maxsize=32)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
二、高级用法与参数详解
1. 缓存大小调优
maxsize参数控制缓存容量,设置为None表示无限制(慎用):
@lru_cache(maxsize=256) # 适合中等规模计算
def process_data(data_id):
# 耗时数据处理逻辑
...
2. 类型敏感模式
设置typed=True时,区分参数类型:
@lru_cache(typed=True)
def convert_value(x):
return str(x)
convert_value(5) # 缓存键: (5,)
convert_value(5.0) # 不同缓存键: (5.0,)
三、实战案例:Web API响应缓存
构建带缓存的天气查询服务:
import requests
from functools import lru_cache
from datetime import timedelta
@lru_cache(maxsize=100, typed=False)
def get_weather(city: str, country: str):
"""缓存天气API响应,有效减少API调用"""
base_url = "https://api.openweathermap.org/data/2.5/weather"
params = {
'q': f"{city},{country}",
'appid': 'your_api_key',
'units': 'metric'
}
response = requests.get(base_url, params=params)
response.raise_for_status()
return response.json()
# 首次调用实际请求API
weather1 = get_weather("Beijing", "CN")
# 相同参数直接返回缓存
weather2 = get_weather("Beijing", "CN")
缓存命中率可通过get_weather.cache_info()
查看:
CacheInfo(hits=1, misses=1, maxsize=100, currsize=1)
四、性能对比测试
使用timeit模块测试斐波那契数列计算的性能差异:
n值 | 无缓存(ms) | 有缓存(ms) |
---|---|---|
30 | 320 | 0.05 |
35 | 3600 | 0.07 |
五、注意事项与最佳实践
- 避免缓存可变对象,可能导致内存泄漏
- 对纯函数使用(输出仅依赖输入)
- 定期调用
cache_clear()
防止内存增长 - 不适合高频变化的数据场景