Python 字典大小和内存消耗之间的平衡

Python 字典大小和内存消耗之间的平衡,python,algorithm,memory,data-structures,dictionary,Python,Algorithm,Memory,Data Structures,Dictionary,我正在使用缓存重复呼叫。由于在一些中等大小的测试用例上进行了记忆,我看到执行速度提高了4倍 对于更大的测试用例,将输入映射到输出的记忆字典会占用相当大的内存,以至于我得到了“java.lang.OutOfMemoryError:java heap space”错误(我使用的是Jython) 我可以通过使用memorized\u cache[hash(key)]=value而不是memorized\u cache[key]:value来节省一些内存,前提是hash(key)的字节数小于key。正如

我正在使用缓存重复呼叫。由于在一些中等大小的测试用例上进行了记忆,我看到执行速度提高了4倍

对于更大的测试用例,将输入映射到输出的记忆字典会占用相当大的内存,以至于我得到了
“java.lang.OutOfMemoryError:java heap space”
错误(我使用的是Jython)

我可以通过使用
memorized\u cache[hash(key)]=value
而不是
memorized\u cache[key]:value
来节省一些内存,前提是
hash(key)
的字节数小于
key
。正如@gnibbler所指出的,如果存在哈希冲突,这将导致问题

我可以介绍的另一个节省内存的方法是将字典的大小限制为固定数量的项。这种方法已经存在,但我想截断访问次数最少的元素

以下是我写的:

from collections import Counter

class FrequencySizedDict(dict):
    def __init__(self, size=1000):
        dict.__init__(self)
        self._maxsize = size
        self._counter = Counter()
    def __getitem__(self, key):
        self._counter[key] += 1
        return dict.__getitem__(self, key)
    def resize(self, size):
        keys = list(self._counter.most_common(size))
        items = [(key, dict.__getitem__(self, key)) for key in keys]
        self.clear()
        dict.update(self, items)
    def __setitem__(self, key, value):
        if len(self._queue) >= self._maxsize:
            self.resize(self._maxsize/2)
        self._counter[key] += 1
        dict.__setitem__(self, key, value)
有没有更好的数据方法来实现这一点,同时减少内存或时间开销<代码>调整大小相当昂贵:
O(n log n)

使用

@functools.lru_缓存(maxsize=128,typed=False)

Decorator将函数包装为一个memonizing可调用函数,可将最近的调用保存为maxsize。当使用相同的参数周期性地调用昂贵的或I/O绑定的函数时,它可以节省时间


或者如答案中所述,当你有一个哈希冲突时,记忆化的缓存[hash(key)]将导致有趣的错误。这是Python3.2+的最佳答案,不幸的是Jython还没有出现。Woops,没有意识到这是Py3唯一的功能。添加了一个链接到一个应该与JythonI一起使用的库。我真的在寻找一个使用频率最低的缓存算法,但是这个答案让我找到了正确的方向。这个LFU实现看起来有点类似于我的原始代码:,使用计数器跟踪访问项的频率。