[英]How to apply a maximum cache size to memoize?
我在一个类上使用这个memoize装饰器,它非常有效。 现在我准备交换一些速度来控制内存消耗。 理想情况下,我可以设置最大值; (例如:2GB)但我想我可以试用和错误很多,并在缓存中满足最大数量的对象。
有人知道一些现成的代码吗? 我想我会删除缓存中最老的以添加最新的。
或者有更合理的方法吗?
这是我目前正在使用的例程:
def memoize(obj):
"""A decorator to cache advice objects using the advice key"""
cache = obj.cache = {}
@functools.wraps(obj)
def memoizer(*args, **kwargs):
key = args[0]
if key not in cache:
cache[key] = obj(*args, **kwargs)
return cache[key]
return memoizer
似乎明智的做法是将max作为arg给装饰者,如:
@memoize(max=2000)
class Foo(object):
...
如果您使用的是Python 3.2,那么标准库中已有一个很好的缓存装饰器:
import functools
@functools.lru_cache(maxsize=1000)
def fun(...):
否则,我只是看一下lru_cache
的实现。 它是一个很好的纯Python通用memoizer,具有LRU语义(就像你正在使用的FIFO语义,但有点复杂),以获得更好的缓存性能。
如果是我,我可能会这样做:
from collections import deque
def memoize(obj, maxlen = None):
"""A decorator to cache advice objects using the advice key"""
cache = obj.cache = {}
deck = obj.deck = deque([], maxlen = maxlen)
@functools.wraps(obj)
def memoizer(*args, **kwargs):
key = args[0]
if key not in cache:
if len(deck) == deck.maxlen:
del cache[deck.popleft()[0]]
temp = obj(*args, **kwargs)
cache[key] = temp
deck.append((key, temp))
return cache[key]
return memoizer
这应该是接近的,但我在编辑器中写了这个,而不是在提示中。 它可能需要一些改进。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.