9.1.3関数の結果をキャッシュする
>>> import random
>>> from functools import lru_cache
>>>
>>> #0~100の乱数を取得
>>> @lru_cache(maxsize=8)
... def get_0to100():
...    return random.randint(0,100)
...
>>> print(get_0to100())
22
>>> print(get_0to100())
22
>>>
  1. 1.最初にrandomモジュールをインポートしています。これはPythonの標準ライブラリで、乱数(ランダムな数値)を生成するための関数を提供しています。

  2. 2.次にfunctoolsモジュールからlru_cacheをインポートしています。lru_cacheはPythonのデコレータの一つで、最近最も少なく使われた項目(Least Recently Used)から順にキャッシュされた結果を削除するというキャッシュ方式を提供します。

  3. 3.@lru_cache(maxsize=8)という行が出てきます。これは次に定義する関数get_0to100の結果を最大8個までキャッシュすることを示しています。

  4. 4.get_0to100関数は0から100までの乱数を返す関数です。

  5. 5.そしてget_0to100関数を呼び出しています。通常ならば、この関数を呼び出すたびに0から100までのランダムな数値が返されます。

  6. 6.しかしlru_cacheデコレータが適用されているため、最初に呼び出したときの結果がキャッシュ(一時記憶領域)に保存されます。そして次回以降の呼び出しでは、同じ引数に対してはキャッシュから結果を取り出すので、同じ値が返されます。

  7. 7.そのため、print(get_0to100())を2回実行しても、両方とも同じ値(この例では22)が表示されます。

注意点として、このコードは関数の返り値がランダム(毎回異なる可能性がある)であるにも関わらず、キャッシュを使用しているという点で、一般的な使用例とは異なる挙動を示します。一般的には、引数が同じならば返り値も同じであるという前提のもと、キャッシュを使用します。