Python の 高機能 caching ライブラリ Ring の紹介

Python の 高機能 caching ライブラリ Ring の紹介

こんにちは。るんたろうです。

仕事がプログラマーなので、気が向いたらこういう気になったライブラリの紹介とかしていきます。今日は、Pythonの関数ベースでの出力をキャッシュしてくれるライブラリの Ring についてです。

Python のキャッシュライブラリについて

Python のキャッシュライブラリはすでにいくつかありまして、標準ライブラリにもその一つがあります。

参考リンク

functools.lru_cache

functools は標準ライブラリで、その中に lru_che という関数を使えば、関数の出力をキャッシュできます。関数の引数はハッシュ化できるものである必要があります。

保存先はメモリなので、プロセスが落ちるとそのキャッシュを使えません。

Beaker

Web Application のキャッシュ用途として作成されてるライブラリです。いろいろなプロジェクトで使われている模様です。HTMLの出力のキャッシュなどに長けてます。ただ、今回の関数のキャッシュという用途にはさほど作り込まれてない印象を受けました。

Dogpile

Beaker の代替として作られているプロジェクトらしいです。

Cachier

あまり今の所人気はないですが、関数のキャッシュという意味ではこれが大体のところを抑えているのかなぁという印象を持ってました。

他にもいくつか探せば出てくるのですが、これといったキラーライブラリはないなぁと思っていました。

関数ベースのキャッシュライブラリ Ring

Hacker News で話題になっていたことから、少し調べてみようと思ったこの ring というライブラリですが、まずドキュメントがしっかりしているなぁという印象を受けました。

先に紹介したライブラリとの大きな違いは、コンピューターサイエンス用途にと言及されている点です。

LRU の拡張

このリンクで最初に簡単な使い方の説明がありますが、キャッシュを削除したり確認したりするなどの関数が設定されています。このあたりは標準の functools にはないので便利ですね。

バックエンドが選べる

いろいろな保存方法をお手軽に選べるのは便利ですね。

  • pymemcache

    • memcached というキャッシュ用のサーバーへとつなぐクライアントです。
  • redis

    • 言わずとしれたメモリ上のNoSQL DB
  • shelve

    • python で書かれた永続性のあるdict
  • DiskCache

    • Python で書かれたディスク上のキャッシュを保存するためのライブラリ。これが一番お手軽そう。
  • python's dict

    • キャッシュを Python の dict 形式で保存する。

コード例

一番簡単なサンプルを持ってきましたが、基本的には標準の functools.lru_cache と一緒の使い方でデコレータで関数を覆うだけです。書き方はバックエンドによって様々なので、使いたい用途に合わせて変更してください。

まだ numpy の対応はしてない

他のライブラリも含めて、直接 hash 化できない numpy array をそのまま関数の引数にしてキャッシュを作るのはできませんでした。このあたりの実装が終われば、機械学習用途でもかなり使えそうになりそうですね。

以上、自分の備忘録がてらのご紹介でした!

ブログランキング・にほんブログ村へ