2

クラスでこの 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

次のように最大値を引数としてデコレータに与えるのが賢明なようです:

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

2 に答える 2

7

Python 3.2を使用している場合、標準ライブラリにはすでに優れたキャッシングデコレータがあります。

import functools

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

それ以外の場合は、の実装を確認しlru_cacheます。これは、キャッシュパフォーマンスを向上させるためのLRUセマンティクス(使用しているFIFOセマンティクスと同様ですが、もう少し洗練されたもの)を備えた優れた純粋なPython汎用メモ化ツールです。

于 2012-09-20T04:25:24.877 に答える
1

私だったら、おそらく次のようにします。

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

それは近いはずですが、プロンプトではなく、ここのエディターで書きました。多少の改良が必要な場合があります。

于 2012-09-20T03:20:14.763 に答える