🐍

Pythonでcachetoolsを利用した処理の高速化

2020/09/27に公開
  • キャッシュを利用した処理の高速化が、pythonでも可能かどうかを調査。
  • 結果、cachetoolsというライブラリを利用して容易に利用できることが判明。
  • そこで今回はライブラリの概要と処理の記述例を記載。
  • ※この内容では、概要や結果イメージ・基本記述を扱うため、詳細内容はドキュメントを参考。

概要

  • cachetoolsとは、キャッシュを利用した高速化処理(メモ化)をまとめたコレクションライブラリ。
  • 特徴は以下。
    • 少ない記述で、多くのキャッシュアルゴリズムを扱うことができる。
    • 拡張可能で、用途や環境に合わせて適切な仕組みへ変更することが可能。
    • データはRAMに保存される。
  • Github : cachetools

結果

  • 以下の2枚の比較画像のように、少ない記述で容易に重たい処理を高速化することが可能。

image.png

image.png

環境

  • Google Colaboratory

インストール

  • 以下のコマンドをcolaboratory上でうち、cachetoolsをインストールする。
    • ※ローカル上でPythonを利用する場合、先頭の!は必要ない。
!pip install cachetools

記述例

※この内容では、概要や結果イメージ・基本記述を扱うため、詳細内容はドキュメントを参考。

基本

  • 標準(オプション指定無し)のキャッシュ処理を利用する場合。
# ライブラリの読み込み
from cachetools import cached

# キャッシュ有効化
@cached(cache ={})
def fibonacci(n):
  if n <= 2:
    return 1
  else:
    return fibonacci(n - 2) + fibonacci(n - 1)

print(fibonacci(30))

各オプション

  • 以下利用できるキャッシュ処理の種類は下記。
名前 内容
TTLCache キャッシュの存続可能時間指定。
存続可能時間を超えたものにはアクセス不可。
最も使用頻度の低いアイテムから破棄される。
LFUCache 最小使用頻度。アイテム取得頻度を計測して、最も頻繁に使用されていないものから破棄
LRUCache 最長未使用頻度。最も長く使用されていないものから破棄
RRCache ランダム。アイテムをランダムに選択して、そこから破棄
  • 以下、記述例
# ライブラリの読み込み
from cachetools import cached, LFUCache, TTLCache, RRCache

@cached(cache=LFUCache(maxsize=10))  # 最大保持数
def get_all_item:
  # 処理

@cached(cache=TTLCache(maxsize=10, ttl=300))  # 最大保持数と存続可能時間
def get_user_item:
  # 処理

@cached(cache=RRCache(maxsize=10, choice=min))  # 最大保持数と任意の要素を返す代替関数
def get_random:
  # 処理。cache.choiceで指定関数(min)の呼び出し可能。

参考

Discussion