ここの memoize レシピを使用しており、2 つの値を返す関数用に少し変更しています。このラッパーを使用して、1 番目と 2 番目の値を個別に返す 2 つの別個の関数を作成しますが、返された関数のいずれかが同じ引数で呼び出されたときにオーバーヘッドが発生しないように、関数の評価はキャッシュされます。このラッパーのコードは次のとおりです。
def memoize(obj, cache_limit=10):
'''
This function caches the return value each time it is called. partial() is used to return the appropriate value.
Cache size is limited to 10
See here for details on this design pattern: https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize
'''
cache = obj.cache = {}
key_cache = collections.deque()
@functools.wraps(obj)
def memoizer(which, *args, **kwargs):
key = str(args)
if key not in cache:
cache[key] = obj(*args, **kwargs)
key_cache.append(key)
if len(key_cache) >= cache_limit:
del cache[key_cache.popleft()]
return cache[key][which]
return functools.partial(memoizer, 0), functools.partial(memoizer, 1)
今、私はf
このようにクラスで定義されている関数でこれを使用しようとしています:
class test_function:
def __init__(self):
''''''
def f(self,x):
return 2*x, 3*x
そして、私はそれをこのように呼んでいます
a = test_function()
f_v1, f_v2 = memoize(a.f)
成功するとf_v1(x)
が返さ2x
れ、f_v2(x)
が返され3x
ます。しかし、これはエラーで失敗します:
AttributeError: 'instancemethod' object has no attribute 'cache'
関数がクラス外で宣言されている場合、私のコードは正常に動作します。私は何が欠けていますか?を使用してPython 2.7
います。