参照透過性の関数があるとしましょう。覚えるのはとても簡単です。例:
def memoize(obj):
memo = {}
@functools.wraps(obj)
def memoizer(*args, **kwargs):
combined_args = args + (kwd_mark,) + tuple(sorted(kwargs.items()))
if combined_args not in memo:
memo[combined_args] = obj(*args, **kwargs)
return cache[combined_args]
return memoizer
@memoize
def my_function(data, alpha, beta):
# ...
data
ここで、への議論my_function
が巨大であると仮定します。たとえば、frozenset
何百万もの要素が含まれています。この場合、メモ化のコストは法外です。毎回hash(data)
、辞書検索の一部として計算する必要があります。
デコレータ内のオブジェクトの代わりに、memo
辞書を属性にすることができます。このようにして、別の巨大なものが同じになる可能性はごくわずかであるため、キャッシュルックアップを実行するときに引数を完全にスキップできます。ただし、このアプローチでは、に渡された引数が汚染されてしまいます。さらに悪いことに、2つ以上の大きな引数がある場合、これはまったく役に立ちません(1つの引数にしかアタッチできません)。data
memoize
data
frozenset
my_function
memo
他にできることはありますか?