通过复用计算结果,显著提升代码性能的完整指南
存储昂贵函数调用的结果(如复杂计算、网络请求、数据库查询),避免重复执行相同逻辑。
减少外部资源(数据库、API)的访问频率,缓解系统负载。
内存读取远快于磁盘/网络I/O,显著缩短延迟,改善用户体验。
存储所有函数调用结果,无大小限制(适用于结果集小的场景):
LRU(最近最少使用)策略:自动淘汰最久未使用的缓存项,防止内存溢出:
适用于简单场景或需自定义缓存逻辑时:
淘汰最久未访问的数据(@lru_cache的底层策略)。
适用场景:Web应用、数据库查询(如缓存商品列表)。
淘汰使用频率最低的数据。
示例:缓存电影信息,替换访问次数最少的条目。
为缓存项设置过期时间,避免返回陈旧数据:
缓存已爬取的页面内容,避免重复请求:
缓存递归函数中间结果(如斐波那契数列),或机器学习模型权重。
问题:大量缓存同时失效导致请求风暴。
方案:错开过期时间,或后台异步刷新缓存。
问题:频繁访问不存在的数据(绕过缓存)。
方案:缓存空值或使用布隆过滤器。
问题:源数据更新后缓存未同步。
方案:手动失效缓存(如cache.clear())或订阅数据变更事件。
支持TTLCache、LFUCache等策略。
磁盘缓存,突破内存限制。
分布式缓存,适合多节点应用。
Python缓存通过复用结果显著提升代码性能,核心方案包括:
@cache、@lru_cache
LRU适用于通用场景,TTL适合时效数据
设置缓存上限、避免易变数据、监控命中率
实际应用中需结合场景权衡,如爬虫侧重网络请求缓存,计算任务聚焦结果复用。
Python缓存技术
缓存的核心价值
减少重复计算
降低资源消耗
提升响应速度
Python内置缓存方案
1. functools模块装饰器
@cache
from functools import cache
@cache
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2) # 避免重复计算子树
@lru_cache(maxsize=None)
from functools import lru_cache
@lru_cache(maxsize=128) # 限制缓存条目数
def fetch_data(url):
response = requests.get(url)
return response.text
2. 手动字典缓存
cache = {}
def get_page(url):
if url in cache: # 检查缓存
return cache[url]
response = requests.get(url)
cache[url] = response.text # 存储结果
return response.text
高级缓存策略对比
LRU(Least Recently Used)
LFU(Least Frequently Used)
TTL(Time-To-Live)
from cachetools import TTLCache
ttl_cache = TTLCache(maxsize=100, ttl=300) # 5分钟过期
应用场景与最佳实践
Web应用优化
Web爬虫加速
@lru_cache(maxsize=1000)
def scrape_page(url):
return requests.get(url).content
计算密集型任务
最佳实践
常见陷阱与规避
缓存雪崩(Cache Stampede)
缓存穿透(Cache Breakdown)
数据一致性
扩展工具库
cachetools
diskcache
Redis
总结
内置装饰器
策略选择
关键注意点
Python 缓存加速代码的详细指南
作者:zvvq博客网
免责声明:本文来源于网络,如有侵权请联系我们!