cachetools中cachedmethod装饰器缺失缓存统计信息的问题咨询
问题原因与解决方案
这不是cachetools的疏漏,而是默认设计的结果:
- 原生的
LRUCache是轻量实现,本身不带命中/未命中统计功能,所以直接调用nums.cache.cache_info()会报错。 cachedmethod装饰器仅负责将方法与实例缓存绑定,不会自动给装饰后的方法添加cache_info()方法。
要获取缓存统计,你需要用cachetools提供的StatsCache包装器,给LRUCache添加统计功能,具体实现如下:
修改后的代码
from cachetools import LRUCache, cachedmethod, StatsCache class CachedNum(object): def __init__(self, cachesize): # 用StatsCache包装LRUCache,启用统计功能 self.cache = StatsCache(LRUCache(maxsize=cachesize)) @cachedmethod(lambda self: self.cache) def get(self, num): return num + 1000 # 测试 nums = CachedNum(cachesize=10) nums.get(1) # 未命中 nums.get(1) # 命中 nums.get(2) # 未命中 # 获取缓存统计 print(nums.cache.cache_info()) # 输出示例:CacheInfo(hits=1, misses=2, maxsize=10, currsize=2)
让方法直接支持cache_info()
如果你希望通过nums.get.cache_info()调用统计,可以给类方法添加一个属性指向缓存的统计方法:
class CachedNum(object): def __init__(self, cachesize): self.cache = StatsCache(LRUCache(maxsize=cachesize)) # 把原方法改名,避免装饰器冲突 @cachedmethod(lambda self: self.cache) def _get(self, num): return num + 1000 @property def get(self): # 保留原方法的缓存逻辑,同时添加cache_info方法 wrapped = self._get wrapped.cache_info = lambda: self.cache.cache_info() return wrapped # 调用方式 nums = CachedNum(cachesize=10) nums.get(1) nums.get(1) print(nums.get.cache_info())
StatsCache会自动记录缓存的命中、未命中、当前大小等数据,完全满足你的统计需求。
内容的提问来源于stack exchange,提问作者aggsol
相关产品推荐
相关产品推荐

