2012-09-20 51 views
2

我在课堂上使用这个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 

似乎是合理的给予最高为ARG像装饰:

@memoize(max=2000) 
class Foo(object): 
    ... 
+0

如果您的对象具有不同的大小,那么可能很难估计缓存占用的内存空间。如果你不能指望最后使用的对象可能会被重用,那么最好的策略可能是将第一个xxx对象保存在内存中 –

回答

6

如果你正在使用Python 3.2时,已经是在标准库中一个很好的缓存装饰:否则

import functools 

@functools.lru_cache(maxsize=1000) 
def fun(...): 

,我只是看看的lru_cache实施。这是一个很好的具有LRU语义的纯Python通用备忘录(就像你使用的FIFO语义,但有点复杂),以获得更好的缓存性能。

+1

在这里找到2.6+版本:http://code.activestate.com/recipes/578078/ –

1

如果是我我可能会做这样的事情:

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 

这应该是接近,但我写在编辑器这里,而不是在提示。它可能需要一些改进。