Python|functools|lru_cache

hgh
3 min readOct 6, 2020

--

官方用法&解說:

目的

一個為函數提供緩存功能的裝飾器,緩存 maxsize 組傳入參數,在下次以相同參數調用時直接返回上一次的結果。用以節約高開銷或 I/O 函數的調用時間。

用法

不同模式的參數可能被視為不同從而產生多個緩存項,例如:f(a=1, b=2) 和 f(b=2, a=1) 因其參數順序不同,可能會被緩存兩次。

如果指定了 user_function,它必須是一個可調用對象。 這允許 lru_cache 裝飾器被直接應用於一個用戶自定義函數,讓 maxsize 保持其默認值 128。如果 maxsize 設為 None,LRU 特性將被禁用且緩存可無限增長; 設置為 2 的冪次時,性能最佳。如果 typed 設置為 true,不同類型的函數參數將被分別緩存。例如:f(3) 和 f(3.0) 將被視為不同而分別緩存。

為了衡量緩存的有效性以便調整 maxsize 形參,被裝飾的函數帶有一個 cache_info() 函數。當調用 cache_info() 函數時,返回一個具名元組,包含命中次數 hits,未命中次數 misses,最大緩存數量 maxsize 和當前緩存大小 currsize。在多線程環境中,命中數與未命中數是不完全準確的。

該裝飾器也提供了一個用於清理/使緩存失效的函數 cache_clear()。原始的未經裝飾的函數可以通過 __wrapped__ 屬性訪問。它可以用於檢查、繞過緩存,或使用不同的緩存再次裝飾原始函數。

一般來說,LRU 緩存只在當你想要重用之前計算的結果時使用。因此,用它緩存具有副作用的函數、需要在每次調用時創建不同、易變的對象的函數或者諸如 time() 或 random() 之類的不純函數是沒有意義的。

@functools.lru_cache() 使用範例

結果:

補充

Least Recently Used (LRU): 最近最少使用(LRU)演算法為一種記憶體、快取中的區塊替換策略。由於記憶體、快取的容量有限,所以需要用演算法決定要替換哪個區塊,使得效能最佳。LRU 就是其中一種經典的演算法,LRU 把最近最少使用的區塊替換出去,其核心思想為:如果某個區塊最近被使用過,那麼將來會被存取的機率很高。

參考

--

--