「Pythonでの処理を高速化したい」
「Pythonでキャッシュを利用したい」
「MemcachedやRedisなどを利用できる環境ではない」
このような場合には、cachetoolsがオススメです。
この記事では、Pythonの高速化ができるcachetoolsについて解説しています。
本記事の内容
- cachetoolsとは?
- cachetoolsのシステム要件
- cachetoolsのインストール
- cachetoolsの動作確認
それでは、上記に沿って解説していきます。
cachetoolsとは?
cachetoolsとは、キャッシュ機能を提供するPythonライブラリです。
キャッシュ機能を利用すれば、処理を高速化できるにようになります。
利用方法としては、Pythonデコレータとして利用します。
そのため、既存コードを変更する必要がありません。
ただし、関数化を適切にしておく必要はあります。
関数化を適切にできていれば、cachetoolsの恩恵を大きく受けることができます。
また、cachetoolsには次のキャッシュアルゴリズムが用意されています。
しかし、cachetoolsにおいてはそれらは必要ありません。
すべてPythonで開発されており、大袈裟なことにはなりません。
したがって、気軽にcachetoolsを試すことができます。
以上、cachetoolsについて説明しました。
次は、cachetoolsのシステム要件を説明します。
cachetoolsのシステム要件
現時点(2022年8月)でのcachetoolsの最新バージョンは、5.2.0となります。
この最新バージョンは、2022年5月30日にリリースされています。
サポートOSに関しては、以下を含むクロスプラットフォーム対応です。
- Windows
- macOS
- Linux
サポート対象となるPythonのバージョンは、以下となっています。
- Python 3.7
- Python 3.8
- Python 3.9
- Python 3.10
これは、以下のPython公式開発サイクル通りです。
バージョン | リリース日 | サポート期限 |
3.6 | 2016年12月23日 | 2021年12月23日 |
3.7 | 2018年6月27日 | 2023年6月27日 |
3.8 | 2019年10月14日 | 2024年10月 |
3.9 | 2020年10月5日 | 2025年10月 |
3.10 | 2021年10月4日 | 2026年10月 |
なお、Python 3.6のサポートは2021年で終了しています。
以上、cachetoolsのシステム要件を説明しました。
次は、cachetoolsのインストールを説明します。
cachetoolsのインストール
検証は、次のバージョンのPythonで行います。
$ python -V Python 3.10.2
まずは、現状のインストール済みパッケージを確認しておきます。
$ pip list Package Version ---------- ------- pip 22.2.2 setuptools 63.4.2 wheel 0.36.2
次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。
python -m pip install --upgrade pip setuptools
では、cachetoolsのインストールです。
cachetoolsのインストールは、以下のコマンドとなります。
pip install cachetools
cachetoolsのインストールは、すぐに終わります。
終了したら、どんなパッケージがインストールされたのかを確認します。
$ pip list Package Version ---------- ------- cachetools 5.2.0 pip 22.2.2 setuptools 63.4.2 wheel 0.36.2
cachetoolsが依存するパッケージは、ありません。
そのため、cachetoolsは既存環境に容易に導入可能です。
このことにより、Python処理の高速化を気軽に試せます。
以上、cachetoolsのインストールを説明しました。
次は、cachetoolsの動作確認を説明します。
cachetoolsの動作確認
cachetoolsの動作確認を行います。
まずは、cachetoolsを利用せずに重たい処理を実行してみましょう。
重たい処理には、フィボナッチ数列の計算を行うようにします。
import time def fib(n): """Compute the nth number in the Fibonacci sequence""" return n if n < 2 else fib(n - 1) + fib(n - 2) if __name__ == '__main__': start = time.time() print(fib(42)) elapsed_time = time.time() - start print("経過時間:{0}".format(elapsed_time) + "[秒]")
上記を実行した結果は、以下。
267914296 経過時間:92.57384753227234[秒]
約92秒の時間がかかりました。
この処理をcachetoolsを使って、高速化してみましょう。
cachetoolsを用いてフィボナッチ数列の計算(fib関数)を高速化したコードは、以下。
import time from cachetools import cached @cached(cache={}) def fib(n): """Compute the nth number in the Fibonacci sequence""" return n if n < 2 else fib(n - 1) + fib(n - 2) if __name__ == '__main__': start = time.time() print(fib(42)) elapsed_time = time.time() - start print("経過時間:{0}".format(elapsed_time) + "[秒]")
追記したのは、以下のコードだけです。
from cachetools import cached @cached(cache={})
Pythonのデコレータという機能を用いています。
デコレータの利用により、既存関数(fib関数)を改修しています。
デコレータについては、とりあえずこの辺にしておきます。
cachetoolsで高速化したコードを実行した結果は、以下になります。
267914296 経過時間:0.00025153160095214844[秒]
それぞれの結果をまとめたのが、次の表です。
cachetoolsなし | cachetoolsあり |
92.57384753227234秒 | 0.00025153160095214844秒 |
桁が違いますね。
別次元と言った方が、適切かもしれません。
もちろん、これは顕著な例なのでしょう。
cachetools公式サイトで紹介されているコードですからね。
そうだとしても、ここまで結果に差が出ることは注目すべきです。
使いようによっては、かなりの効果(高速化)を得られます。
以上、cachetoolsの動作確認を説明しました。