【发布时间】:2013-02-03 11:19:14
【问题描述】:
使用此处找到的 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
我可以用它创建一个装饰类方法,但它最终会创建一个全局缓存,适用于类 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)
是否有一个装饰器或技巧可以让我轻松地让这个装饰器为每个类实例创建一个缓存?
【问题讨论】:
-
请记住,装饰器只是
def method: pass; method = decorate(method)的语法糖。因此,您可以机械地翻译它以在您的__init__中创建装饰方法。 -
你确定你知道什么是“类方法”吗?因为我认为你寻找一个正常的方法。如果类方法是特定于实例的,则根据定义,它是实例的普通方法。或者为什么你甚至需要一个类方法?或者你为什么想要一个“每个实例”的缓存?
标签: python caching decorator lru