Python3.7.3 # Python>=3.2
通常、redisはキャッシングに使用されると聞きますが、redisは結果データを格納するためにキャッシュを変更します。Pythonのバージョン3.2から、非常に洗練されたキャッシングマシンが導入されました
from functools import lru_cache
lru_cacheは、プログラム実行の効率を向上させることができ、特に時間のかかる関数に適しています。キャッシュの効果を実現するには、必要な関数、特に一部の再帰関数にデコレータを追加するだけで済みます。
def fab(n):if n <=2:return n
returnfab(n-1)+fab(n-2)print(datetime.datetime.now()) # 2019-05-2414:21:43fab(40)print(datetime.datetime.now()) # 2019-05-2414:22:20
**キャッシュを使用しない場合、fab(40)の実行時間は約37秒かかりますか?? **
from functools import lru_cache
import datetime
@ lru_cache(None)
def fab(n):if n <=2:return n
returnfab(n-1)+fab(n-2)print(datetime.datetime.now()) # 2019-05-2414:24:00.229715fab(40)print(datetime.datetime.now()) # 2019-05-2414:24:00.229823
**キャッシュが追加されると、fab(40)?? **の実行に1秒もかかりません。
少しテストしてください
def fab(n):print(n)return None
fab(10)fab(10)fab(10)
from functools import lru_cache
@ lru_cache(None)
def fab(n):print(n)return None
fab(10)fab(10)fab(10)fab(9)fab(9)
**結果から、fab(10)が2回呼び出されたとき、関数本体は実際には実行されませんが、キャッシュされた結果が直接返されることがわかります。 ****
**functoolsモジュールのlur_cacheデコレータを使用すると、この関数の最大最大呼び出し結果をキャッシュできるため、特に時間のかかる関数に適したプログラム実行の効率が向上します。パラメータmaxsizeは、キャッシュの最大数です。Noneの場合、制限はありません。2nに設定すると、パフォーマンスが最高になります。typed= Trueの場合(functools32にそのようなパラメータがないことに注意してください)、異なるパラメータタイプの呼び出しが個別にキャッシュされます。たとえば、f(3)およびf(3.0)。 **** lru_cacheで装飾された関数には、cache_clearとcache_infoの2つのメソッドがあり、それぞれキャッシュをクリアしてキャッシュ情報を表示するために使用されます。 ****
Recommended Posts