Python类函数使用functools.lru_cache/cache无法缓存结果问题
类中使用lru_cache缓存失效的解决办法
你遇到的问题是类实例方法使用lru_cache后缓存未生效,核心原因是实例方法的self参数会被纳入缓存键的计算:每次调用intensive_func时,lru_cache会把当前实例对象(self)和传入的a、b、c一起作为缓存的唯一标识。如果是不同的ob实例调用该方法,哪怕a、b、c完全相同,因为self是不同的对象,缓存也不会复用,函数会重复执行。
针对这个问题,有几种可行的解决方案:
方案1:改用静态方法(无需访问实例属性时)
如果intensive_func不需要访问类实例的任何属性或方法,可以将其改为静态方法,这样就不会传入self参数,缓存仅基于a、b、c:
from functools import lru_cache class ob: def __init__(self): pass @staticmethod @lru_cache(maxsize=8) def intensive_func(a, b, c): print("called") return a + b + c
方案2:改用类方法(需访问类属性时)
如果方法需要访问类级别的属性或方法,可以改为类方法,此时传入的第一个参数是类对象cls(同一个类的所有实例共享同一个cls),缓存会在所有实例间共享:
from functools import lru_cache class ob: def __init__(self): pass @classmethod @lru_cache(maxsize=8) def intensive_func(cls, a, b, c): print("called") return a + b + c
方案3:保留实例方法但确保复用同一个实例
如果必须保留实例方法(需要访问当前实例的属性),那要确保所有调用都使用同一个ob实例,这样self的哈希值一致,缓存就能正常生效:
from functools import lru_cache class ob: def __init__(self): pass @lru_cache(maxsize=8) def intensive_func(self, a, b, c): print("called") return a + b + c # 复用同一个实例 my_ob = ob() my_ob.intensive_func(1,2,3) # 打印"called" my_ob.intensive_func(1,2,3) # 直接返回缓存结果,不打印
额外排查点
如果以上方案都没解决问题,可以检查:
- 确认
Timestamp类型参数的哈希一致性:比如两个看似相同的Timestamp是否时区不同、是否存在微秒级差异,这些都会导致哈希值不同,缓存无法复用。 - 检查
maxsize是否过小:如果缓存容量被占满,旧的缓存会被淘汰,可能导致重复执行。
内容的提问来源于stack exchange,提问作者user22120086
相关产品推荐
相关产品推荐

