簡體   English   中英

如何應用最大緩存大小來記憶?

[英]How to apply a maximum cache size to memoize?

我在一個類上使用這個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):
   ...

如果您使用的是Python 3.2,那么標准庫中已有一個很好的緩存裝飾器:

import functools

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

否則,我只是看一下lru_cache的實現。 它是一個很好的純Python通用memoizer,具有LRU語義(就像你正在使用的FIFO語義,但有點復雜),以獲得更好的緩存性能。

如果是我,我可能會這樣做:

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

這應該是接近的,但我在編輯器中寫了這個,而不是在提示中。 它可能需要一些改進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM