Pythonのfunctoolsのlru_cacheを用いた関数の高速化

スポンサーリンク

Pythonのfunctoolsのlru_cacheを用いた関数の高速化を行ってみます。

なお、今回用いるfunctoolsモジュール・ライブラリはPythonの標準ライブラリとなっていますので、事前にインストールする必要はありません。

■Python

今回のPythonのバージョンは、「3.10.9」を使用しています。(Windows11)(pythonランチャーでの確認)

■functoolsのlru_cacheを用いた関数の高速化

では、早速functoolsのlru_cacheを用いた関数の高速化を行ってみます。今回は、引数を受け取ってその値を2倍にする関数をlru_cacheを使って実装してみますので、コードを書いていきます。

■コード

from functools import lru_cache

@lru_cache(maxsize=None)
def double_value(x):
    print("計算中...")
    return 2 * x

if __name__ == "__main__":
    try:
        num = int(input("数字を入力してください: "))
        result = double_value(num)
        print(f"{num}を2倍すると: {result}")

        # 同じ引数で再度呼び出す
        result = double_value(num)
        print(f"{num}をもう一度2倍すると: {result}")
    except ValueError as e:
        print(f"エラー: {e}")

まずfunctoolsモジュールからlru_cache関数をインポートします。lru_cacheはLeast Recently Used(LRU)アルゴリズムを用いたメモ化(キャッシュ)のためのデコレータ関数です。関数の結果をキャッシュし、同じ引数での再実行を高速化するために使用されます。

次に「@lru_cache(maxsize=None)」と記述し、lru_cacheデコレータを関数double_valueに適用。maxsize=Noneとすることで、キャッシュのサイズ制限を無効にし、キャッシュのサイズは制限されません。これにより、全ての関数呼び出しの結果がキャッシュされます。

適用後、def文を用いてdouble_valueという関数を定義します。この関数は引数,パラメータであるxを受け取り、その値を2倍にして返す簡単な処理を行う関数です。lru_cacheのデコレータによって、同じ引数での再実行を高速化するためにキャッシュが有効化されています。

次に「if __name__ == “__main__”:」と記述し、この条件文はPythonスクリプトが直接実行された場合にのみ以下のコードが実行されることを保証するためのブロックです。

num = int(input(“数字を入力してください: “))で、ユーザーに数字を入力してもらうためのメッセージを表示し、input関数を使ってユーザーの入力を受け取り、int関数を使って整数に変換してnumに代入。その後、「result = double_value(num)」と記述し、double_valueという関数に入力した数字numを引数,パラメータとして渡し、その結果をresultに格納しています。

格納後、print関数を用いて、numとresultの値を表示し、結果をユーザーに見せます。

次に「result = double_value(num)」と記述し、同じ引数,パラメータnumを再度double_value関数に渡して、結果を再計算します。しかし、この時点でlru_cacheが有効になっているため、以前の計算結果がキャッシュから返され、再計算は行われません。そのため、「計算中…」のメッセージが表示されることはありません。

再計算後、print関数を用いて再度2倍した結果を表示しますが、キャッシュが使われているため、再計算は行われず、すぐに以前の結果が表示されます。

最後に「except ValueError as e:」と記述し、もしユーザーが数値以外の入力を行った場合には、ValueErrorが発生し、例外処理が行われるように設定します。

■実行・検証

このスクリプトを「main_test.py」という名前で、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、コマンドプロンプトから実行してみます。

実行してみると、定義した関数が呼び出され、入力した数値で計算を行ってみると、Pythonのfunctoolsのlru_cacheを用いているため、関数の実行時間が短縮されていることを確認できました。

 

コメント

タイトルとURLをコピーしました