我正在寻找一种方法来使用 python 的
cachetools
内置缓存库功能,但也支持命中/未命中统计,使用自定义键函数,并且如果可能的话支持无界缓存?
不幸的是,我可以只能找到这些方法:
-
如果我想使用未绑定的缓存,并有命中/未命中统计:
from cachetools.func import lru_cache @lru_cache(maxsize=None) def foo(a, b, c=None): print("foo")
-
如果我想使用未绑定的缓存,并使用自定义键函数:
或者,使用这个“hack”:from cachetools import cached @cached( cache={}, key=lambda a, b, c=None: "a" if c is None else "b" ) def foo(a, b, c=None): print("foo")
from cachetools import cached, LRUCache @cached( cache=LRUCache(maxsize=1, getsizeof=lambda _: 0), # will always pass the test of maxsize check key=lambda a, b, c=None: "a" if c is None else "b" ) def foo(a, b, c=None): print("foo")
如果我想使用命中/未命中统计和自定义按键功能,我该怎么做?
我知道如何自己实现一个,我只是想知道是否有一些已经构建的- 在Python的cachetools/functools中支持这个的方式吗?
cachetools
库本身没有提供一种直接的方法来同时拥有命中/未命中统计信息、自定义键函数和无界缓存。但是,你可以通过组合
cachetools
中提供的不同组件并添加少量代码来实现这一点。
以下是如何实现这一点的方法:
from cachetools import Cache, cached
class StatsCache(Cache):
def __init__(self, maxsize=None, getsizeof=None):
super().__init__(maxsize, getsizeof)
self.hits = 0
self.misses = 0
def __getitem__(self, key):
try:
value = super().__getitem__(key)
self.hits += 1
return value
except KeyError:
self.misses += 1
raise
def get_stats(self):
return self.hits, self.misses
@cached(cache=StatsCache(maxsize=None), key=lambda a, b, c=None: "a" if c is None else "b")
def foo(a, b, c=None):
print("foo")
foo(1, 2)
foo(1, 2)
foo(1, 2, 3)
foo(1, 2, 3)
hits, misses = foo.__wrapped__.__cache__.get_stats()
print(f"Hits: {hits}, Misses: {misses}")
在这个代码中:
-
我们创建了一个名为
StatsCache
的自定义缓存类,该类继承自cachetools.Cache
。 -
在
StatsCache
中,我们初始化了hits
和misses
计数器,并在__getitem__
方法中更新它们,以跟踪缓存命中和未命中。 -
get_stats
方法返回命中和未命中计数。 -
我们使用
cached
装饰器来装饰我们的函数,将我们的StatsCache
实例和自定义key
函数传递给它。 -
我们将
maxsize
设置为None
以获得无界缓存。
通过这种方式,你可以拥有一个具有命中/未命中统计信息、自定义键函数和无界缓存的缓存解决方案。
请记住,由于我们使用的是无界缓存,因此如果缓存的数据量很大,则可能会导致内存使用量过高。
标签:python,caching From: 63437599