Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将最大缓存大小应用于memoize?_Python_Memory Management_Memoization - Fatal编程技术网

Python 如何将最大缓存大小应用于memoize?

Python 如何将最大缓存大小应用于memoize?,python,memory-management,memoization,Python,Memory Management,Memoization,我在课堂上使用这个备忘录装饰器,它非常有效。现在,我准备用这种速度来换取对内存消耗的控制。理想情况下,我可以设置一个最大值;(例如:2GB)但我想我可以反复尝试,并满足于缓存中最大数量的对象 有人知道一些现成的代码来做这件事吗?我想我会扔掉缓存中最旧的,添加最新的 还是有更明智的方法 以下是我目前使用的例程: def memoize(obj): """A decorator to cache advice objects using the advice key""" cache

我在课堂上使用这个备忘录装饰器,它非常有效。现在,我准备用这种速度来换取对内存消耗的控制。理想情况下,我可以设置一个最大值;(例如: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
将最大值作为参数提供给装饰师似乎是明智的,如:

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

如果是我,我可能会这样做:

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

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

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

import functools

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

否则,我只需要看一下的实现。它是一个很好的纯Python通用记忆工具,具有LRU语义(与您正在使用的FIFO语义类似,但有点复杂),可以获得更好的缓存性能。

如果对象大小不同,则很难估计缓存所消耗的内存空间。如果您不能期望最后使用的对象很可能会被重用,那么最好的策略是将第一个xxx对象保留在内存中