-->

Python的LRU缓存装饰每实例(Python LRU Cache Decorator Per I

2019-07-20 03:07发布

使用LRU缓存装饰在这里找到: 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

我可以创建一个装饰类的方法与这一点,但它结束了创建适用于类测试的所有实例的全局高速缓存。 然而,我的意图是建立一个每个实例缓存。 所以,如果我是实例3次的测试中,我将有3级LRU高速缓存,而不是1级LRU缓存为所有3个实例。

我有这种情况发生的唯一迹象是调用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)

有没有一种装饰或伎俩,让我很容易导致此装饰来为每个类创建实例的缓存?

Answer 1:

假设你不想修改代码(例如,因为你要能够公正端口至3.3,并使用STDLIB functools.lru_cache ,或使用functools32出的PyPI的,而不是复制和粘贴的食谱到你的代码),有一个明显的解决方案:创建每个实例的新装修实例方法。

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


Answer 2:

这个怎么样: 函数装饰与包装方法 lru_cache第一次它呼吁每个实例?

def instance_method_lru_cache(*cache_args, **cache_kwargs):
    def cache_decorator(func):
        @wraps(func)
        def cache_factory(self, *args, **kwargs):
            print('creating cache')
            instance_cache = lru_cache(*cache_args, **cache_kwargs)(func)
            instance_cache = instance_cache.__get__(self, self.__class__)
            setattr(self, func.__name__, instance_cache)
            return instance_cache(*args, **kwargs)
        return cache_factory
    return cache_decorator

使用这样的:

class Foo:
    @instance_method_lru_cache()
    def times_2(self, bar):
        return bar * 2

foo1 = Foo()
foo2 = Foo()

print(foo1.times_2(2))
# creating cache
# 4
foo1.times_2(2)
# 4

print(foo2.times_2(2))
# creating cache
# 4
foo2.times_2(2)
# 4

下面是在GitHub上一个要点与一些在线文档。



Answer 3:

这些天来, methodtools将工作

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

您需要安装methodtools

pip install methodtools

如果你还在使用PY2,然后functools32还需要

pip install functools32


文章来源: Python LRU Cache Decorator Per Instance