如何应用最大缓存大小来记忆?

Joh*_*Mee 2 python memory-management memoization

我在一个类上使用这个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
Run Code Online (Sandbox Code Playgroud)

似乎明智地将最大值作为装饰器的arg给出:

@memoize(max=2000)
class Foo(object):
   ...
Run Code Online (Sandbox Code Playgroud)

nne*_*neo 7

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

import functools

@functools.lru_cache(maxsize=1000)
def fun(...):
Run Code Online (Sandbox Code Playgroud)

否则,我只是看看实现lru_cache.它是一个很好的纯Python通用memoizer,具有LRU语义(就像你正在使用的FIFO语义,但有点复杂),以获得更好的缓存性能.