関数キャッシュ(Function caching)

3900 ワード


関数戻り値キャッシュは、関数を最適化する一般的な手段です.関数、入力パラメータ、戻り値をすべて保存し、次回同じパラメータでこの関数を呼び出すと、格納された結果を戻りとして直接使用できます(再計算は必要ありません).
関数キャッシュを使用すると、指定したパラメータに対する関数の戻り値をキャッシュできます.I/Oが密集している関数が同じパラメータで頻繁に呼び出されると、関数キャッシュは時間を節約できます.
 
Python 3.2以降
フィボナッチ計算機を実現しlru_を用いてcache.
from functools import lru_cache

@lru_cache(maxsize=32)
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)

>>> print([fib(n) for n in range(10)])
# Output: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]


#                 ,    :
fib.cache_clear()
  maxsize     lru_cache,            。

functoolsモジュールとcachetoolsモジュールは、同様のキャッシュメカニズムを提供します. 
functoolsはlru_を提供していますCache、キャッシュデータがパラメータを超えた場合maxsizeの値は、LRU(最も最近使用されたアルゴリズム)で最近使用されていないキャッシュ結果をクリアします.
cachetoolsモジュールは、より多くのキャッシュ失効ポリシーを提供します.
  • LFUCache(Least Frequently Used (LFU) cache implementation.)
  • LRUCache(Least Recently Used (LRU) cache implementation.)
  • RRCache(Random Replacement (RR) cache implementation.)
  • TTLCache(LRU Cache implementation with per-item time-to-live (TTL) value.)

  •  
    Python 2シリーズ
    任意の種類のキャッシュメカニズムを作成することができ、同じ効果を達成するにはいくつかの方法があります.これはあなたのニーズに完全に依存します.一般的なキャッシュです.
    from functools import wraps
    
    def memorize(function):
        memo = {}
        @wraps(function)
        def wrapper(*args):
            if args in memo:
                return memo[args]
            else:
                rv = function(*args)
                memo[args] = rv
                return rv
        return wrapper
    
    @memorize
    def fibonacci(n):
        if n < 2: return n
        return fibonacci(n - 1) + fibonacci(n - 2)
    
    fibonacci(25)

     
    まとめ:
    関数のキャッシュは、閉パッケージインスタンスによって実現され、cache装飾器が付けられた関数ごとに、実行時に異なる閉パッケージインスタンスが作成されます.パラメータのキャッシュは、閉パケットインスタンスに導入されたハッシュテーブル(dict)のkeyによって保存される.戻り値のキャッシュは辞書形式で保存され、キーは関数パラメータ、値は関数戻り値です.refer
    Pythonステップ関数キャッシュ(Function caching)
    関数戻り値キャッシュ