@lru_cache装饰器;
@lru_cache装饰器;
核心概念
- 缓存的是函数调用后的返回值(一个具体对象),不是函数本身。
- 第一次调用真正执行函数体;之后所有调用直接返回同一个缓存对象。
maxsize=1如果函数无参数、只有一种调用方式,写不写效果一样,但写出来更能表达"这是当单例用的"这个意图。
装饰在类上:可行,效果等价
类本身是可调用对象(RagGraphBuilder() 本质是一次函数调用),所以可以直接装饰类
注意事项
装饰在实例方法上:⚠️ 陷阱,不推荐
class RagGraphBuilder:
@lru_cache(maxsize=1)
def build(self): # self 也是参数,会被算进缓存 key
...
问题:
self是缓存 key 的一部分 → 不同实例调用会各自缓存,不是全局单例self被缓存字典一直引用 → 实例永远不会被垃圾回收(内存泄漏)
⚠️ lru_cache 只能装饰同步函数:如果需要异步初始化,同步 lru_cache装不下,需要换成手写的异步单例。
浙公网安备 33010602011771号