WMX · 随记
·Python· 3 分钟阅读

lru_cache:缓存结果之前,先确定数据何时过期

给一个读取配置的函数加缓存可以减少重复工作,却也可能让修改后的配置一直不可见。缓存正确性首先取决于结果是否只由键决定。

Python 系列概览:输入校验、数据处理与行为验证
Python 系列概览:输入校验、数据处理与行为验证 点击图片查看大图 ↗

问题从哪里出现

给一个读取配置的函数加缓存可以减少重复工作,却也可能让修改后的配置一直不可见。缓存正确性首先取决于结果是否只由键决定。

理解核心机制

lru_cache 按可哈希参数缓存返回值,并通过 maxsize 限制条目数。它没有内置时间过期机制;版本号加入键或显式 cache_clear,可以表达失效条件。

动手做一个小实验

Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。

Python12 行 · 可横向滚动
from functools import lru_cache
calls = []
@lru_cache(maxsize=16)
def square(version, value):
    calls.append((version, value))
    return value * value

assert square("v1", 4) == square("v1", 4) == 16
assert len(calls) == 1
square("v2", 4)
assert len(calls) == 2
print(square.cache_info())

适用边界与常见误区

缓存可变返回值会把同一对象交给多个调用方。线程安全的缓存管理也不保证同一个缺失键的计算只执行一次。

继续练习

把返回值改成列表,修改第一次取得的结果,再读取缓存;据此决定是否返回不可变值或防御性副本。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档