使用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)
有没有一种装饰或伎俩,让我很容易导致此装饰来为每个类创建实例的缓存?
假设你不想修改代码(例如,因为你要能够公正端口至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)
这个怎么样: 函数装饰与包装方法 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上一个要点与一些在线文档。
这些天来, 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