lru 快取

可以使用 @lru_cache 裝飾器使用最近最少使用的快取來包裝昂貴的,計算密集型的功能。這允許對函式呼叫進行記憶,以便具有相同引數的未來呼叫可以立即返回,而不必重新計算。

@lru_cache(maxsize=None)  # Boundless cache
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

>>> fibonacci(15)

在上面的示例中,fibonacci(3) 的值僅計算一次,而如果 fibonacci 沒有 LRU 快取,則 fibonacci(3) 將被計算超過 230 次。因此,@lru_cache 特別適用於遞迴函式或動態程式設計,其中可以使用相同的精確引數多次呼叫昂貴的函式。

@lru_cache 有兩個論點

  • maxsize:儲存的呼叫數。當唯一呼叫的數量超過 maxsize 時,LRU 快取將刪除最近最少使用的呼叫。
  • typed(在 3.3 中新增):用於確定不同型別的等效引數是否屬於不同快取記錄的標誌(即,如果 3.03 計為不同的引數)

我們也可以看到快取統計資訊:

>>> fib.cache_info()
CacheInfo(hits=13, misses=16, maxsize=None, currsize=16)

注意 :由於 @lru_cache 使用字典來快取結果,因此該函式的所有引數都必須是可清除的,以使快取起作用。

官方 Python 文件為 @lru_cache@lru_cache 在 3.2 中新增。