Pythonでメモ化するデコレータ
昨日のやつ使ってメモ化デコレータ書きました。まずはブツを。
挙動確認とかの為に作ったコードはっ付けます。
もしログ取りたくなったらjust for logging
って書いてある行でloggingするといいと思います。__main__
でガードしてる部分で、挙動確認ついでに簡単に使ってみてます。このコードを実行して得られる結果は以下のような感じです。
>>> is 2 a prime number? memoized (2,) True >>> really? return using cached True >>> okay then, the square of 2 is what? memoized (2,) 4
ちゃんとメモ化されていること、デコレータが毎回別のミュータブルを渡しているため複数の関数をデコレートしてもキャッシュの混在が起こらない事が確認されました。というのも_cache
の位置が悪いと複数のデコレートされた関数が共通のミュータブルを持つような気がしたからです。
他の実装
もちろんメモ化ラッパの実装はこれだけではありません。今回私が作成したものは、昨日紹介したデフォルト値のキャッシュを利用したものです。標準ライブラリにはfunctools.lru_cache
があり、ちょっとググるとプロパティをメモ化するものがありました。よく落ちてるコードだと、クラス使ってなんかやってるみたいです。