Python 如何将最大缓存大小应用于memoize?
我在课堂上使用这个备忘录装饰器,它非常有效。现在,我准备用这种速度来换取对内存消耗的控制。理想情况下,我可以设置一个最大值;(例如:2GB)但我想我可以反复尝试,并满足于缓存中最大数量的对象 有人知道一些现成的代码来做这件事吗?我想我会扔掉缓存中最旧的,添加最新的 还是有更明智的方法 以下是我目前使用的例程: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
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对象保留在内存中