常见缓存机制
- 字典缓存:手动使用Python字典来存储函数的输入和输出结果。例如:
cache = {}
def my_function(a, b):
key = (a, b)
if key not in cache:
result = a + b
cache[key] = result
return cache[key]
functools.lru_cache
:这是Python标准库functools
中的一个装饰器,用于实现最近最少使用(Least Recently Used, LRU)缓存机制。
通过缓存机制优化内存使用
- 减少重复计算:对于相同输入,直接从缓存中获取结果,避免重复执行函数体中的计算逻辑,从而减少CPU资源消耗,间接优化内存使用,因为避免重复计算可能避免中间结果占用额外内存。
- 合理设置缓存大小:对于LRU缓存,可以设置缓存的最大容量,当缓存满时,会移除最近最少使用的条目,防止缓存无限增长导致内存占用过大。
functools.lru_cache
工作原理
- 缓存存储:
lru_cache
使用一个字典来存储函数的输入参数(被哈希化后作为键)和对应的返回值。
- 调用检查:每次函数被调用时,
lru_cache
首先检查输入参数对应的结果是否已经在缓存中。如果存在,则直接返回缓存中的结果;如果不存在,则调用原始函数计算结果,并将结果存入缓存。
- LRU淘汰策略:当缓存达到设定的最大容量(默认为128个条目)时,
lru_cache
会移除最近最少使用的条目,为新的条目腾出空间。
functools.lru_cache
适用场景
- 计算密集型函数:对于那些执行时间长、计算复杂的函数,例如递归计算斐波那契数列等,使用
lru_cache
可以显著提高性能,因为相同输入的计算结果被缓存,下次调用直接返回。
- 频繁调用且输入参数有限的函数:如果函数被频繁调用,并且输入参数的组合数量有限,
lru_cache
可以有效减少重复计算,例如一些配置读取函数,在相同配置条件下,每次调用都可以从缓存获取结果。