gpt4 book ai didi

每个实例的 Python LRU 缓存装饰器

转载 作者:IT老高 更新时间:2023-10-28 22:00:25 33 4
gpt4 key购买 nike

使用此处的 LRU Cache 装饰器: http://code.activestate.com/recipes/578078-py26-and-py30-backport-of-python-33s-lru-cache/

from lru_cache import lru_cache
class Test:
@lru_cache(maxsize=16)
def cached_method(self, x):
return x + 5

我可以用它创建一个装饰类方法,但它最终会创建一个全局缓存,该缓存适用于类 Test 的 所有 实例。但是,我的意图是为每个实例创建一个缓存。因此,如果我要实例化 3 个测试,我将拥有 3 个 LRU 缓存,而不是所有 3 个实例的 1 个 LRU 缓存。

我知道发生这种情况的唯一迹象是,当在不同的类实例修饰方法上调用 cache_info() 时,它们都返回相同的缓存统计信息(这极不可能发生,因为它们正在与非常不同的参数进行交互):

CacheInfo(hits=8379, misses=759, maxsize=128, currsize=128)
CacheInfo(hits=8379, misses=759, maxsize=128, currsize=128)
CacheInfo(hits=8379, misses=759, maxsize=128, currsize=128)

是否有一个装饰器或技巧可以让我轻松地让这个装饰器为每个类实例创建一个缓存?

最佳答案

假设您不想修改代码(例如,因为您希望能够仅移植到 3.3 并使用标准库 functools.lru_cache ,或者使用 PyPI 中的 functools32 而不是复制和粘贴配方到您的代码中),有一个明显的解决方案:为每个实例创建一个新的装饰实例方法。

class Test:
def cached_method(self, x):
return x + 5
def __init__(self):
self.cached_method = lru_cache(maxsize=16)(self.cached_method)

关于每个实例的 Python LRU 缓存装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14946264/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com