この最適化技術により、空きメモリの損失により作業速度が向上します。
bigfunc関数があり、その結果は渡された引数のみに依存し、計算の複雑さが非常に大きいとします。 当然、bigfuncが同じパラメータですでに呼び出されている場合、bigfuncを呼び出すたびに計算を行いたくないでしょう。 次に、メモ化が役立ちます。
Pythonの場合、関数のデコレーターは次のようになります。
cPickleをインポートする defのメモ(関数): メモリ= {} def memo(*引数、** kwargs): ハッシュ= cPickle.dumps((引数、ソート済み(kwargs.iteritems()))) ハッシュがメモリにない場合: メモリ[ハッシュ] = func(* args、** kwargs) メモリを返す[ハッシュ] メモを返す
次に、bigfuncを次のように宣言する必要があります。
@memoized def bigfunc(...): ...
または、既に宣言されている場合はオーバーライドします。
bigfunc = memoized(bigfunc)
記事の冒頭で発表されたデコレータは、ピックアップオブジェクトでのみ機能します。 関数が非粘着オブジェクトで機能する場合、置き換えることができます
ハッシュ= cPickle.dumps((引数、ソート済み(kwargs.iteritems())))
に
ハッシュ=(タプル(args)、フローズンセット(kwargs.items())
ただし、可変オブジェクトを操作する機能は失われます。
デコレータは、キャッシュされるアイテムの数を制限するために簡単に変更できます。