1

私はpythonが初めてで、オンラインで答えを見つけることができませんでした。いくつかの計算を行い、文字列を返すメソッドがあるとしましょう

def output(self)
     a=self.some_long computation1()
     b=self.some_long computation2()
     c=self.some_attribute
     some_computatuion_inside
     return output_string

私はこの関数をいくつかの場所で使用していて、メモ化したいのですが、引数をとらず、呼び出し間で変化する可能性のあるインスタンス属性に依存しているため、どのように処理すればよいかわかりません.

これらの属性が変更されたかどうかを確認する独自のメモ化関数を作成できることはわかっていますが、それは正しくないようです。これはこの関数にのみ固有のものであり、将来的には他の関数についても同じことをしたいと考えているからです。

4

2 に答える 2

1

デコレータは、任意の引数に基づいてキーを計算できます。どのインスタンス メソッドにも引数、つまり がありself、メソッドの memoize デコレータを取得するのは非常に簡単です。

CACHE = {}

def memoize(*attributes):
    def decorator(meth):
        def wrapper(self):
            key = tuple(getattr(self, attr) for attr in attributes)
            try:
                result = CACHE[key]
            except KeyError:
                result = CACHE[key] = meth(self)
            return result
        return wrapper
    return decorator

使用法:

class Factorial(object):
    def __init__(self, n):
        self.n = n
    @memoize('n')
    def compute(self):
        if self.n in (0,1): return self.n
        else:
            return Factorial(self.n-1).compute() + Factorial(self.n-2).compute()


f = Factorial(100)

f.compute()
Out[4]: 354224848179261915075L
于 2013-06-18T11:15:26.063 に答える