matrk's blog

十中八九Python書いてる

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があり、ちょっとググるとプロパティをメモ化するものがありました。よく落ちてるコードだと、クラス使ってなんかやってるみたいです。