You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 10:04:51