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

将 max 作为 arg 给装饰器似乎是明智的,例如:

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

2 回答 2

7

如果您使用的是 Python 3.2,标准库中已经有一个很好的缓存装饰器:

import functools

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

否则,我只会看看lru_cache. 这是一个很好的纯 Python 通用记忆器,具有 LRU 语义(如您正在使用的 FIFO 语义,但更复杂一些)以获得更好的缓存性能。

于 2012-09-20T04:25:24.877 回答
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

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

于 2012-09-20T03:20:14.763 回答