cached_property实现惰性求值与缓存
请介绍functools.cached_property(Python 3.8+)的用途、与@property的区别、线程安全性,以及和lru_cache的缓存策略差异。给出数据库查询结果缓存、大文件解析等实际应用案例。
回答
小字辈
cached_property介绍
cached_property将方法调用结果缓存为实例属性,第一次访问时执行,后续访问直接返回缓存值。
from functools import cached_property
class DataProcessor:
def __init__(self, filepath):
self.filepath = filepath
@cached_property
def data(self):
print('正在加载大数据文件...')
with open(self.filepath) as f:
return f.read()
dp = DataProcessor('large.txt')
print(dp.data) # 第一次:打印并返回值
print(dp.data) # 第二次:直接返回缓存值
vs @property
@property:每次访问都执行方法(无缓存)@cached_property:执行一次后缓存为实例属性
线程安全性
cached_property不是线程安全的(Python 3.8-3.11)。Python 3.12+使用锁保证线程安全。
vs lru_cache
| 特性 | cached_property | lru_cache |
|---|---|---|
| 作用域 | 实例级 | 函数级 |
| 清理 | 删除实例属性或del | cache_clear() |
| 参数 | 无 | 有(maxsize等) |
| 多参数 | 否 | 是 |
**适用场景:**ORM查询结果缓存、API响应缓存、配置文件解析、大数据预处理。