Python 的快取機制: functools.lru_cache

2020/2/28發表於2020-11-22

考研人資訊庫

此公眾號會發表計算機考研(初複試資訊)、夏令營等資料,方便考研人對資訊的獲取,節約自身查詢資料的時間,回覆408,可獲得資料結構、作業系統、計算機網路、計算機組成原理全科資料

使用functools模組的lur_cache裝飾器,可以快取最多 maxsize 個此函式的呼叫結果,從而提高程式執行的效率,特別適合於耗時的函式,也就是說對於相同的計算不會再重複計算,直接在快取中取出值,像動態規劃中的陣列,儲存好已計算的值,為將來直接使用,適用於遞迴。引數maxsize為最多快取的次數,如果為None,則無限制,設定為2n時,效能最佳;如果 typed=True(注意,在 functools32 中沒有此引數),則不同引數型別的呼叫將分別快取,例如 f(3) 和 f(3.0)。

被 lru_cache 裝飾的函式會有 cache_clear 和 cache_info 兩個方法,分別用於清除快取和檢視快取資訊。


例如:

寫一個函式,輸入 n ,求斐波那契(Fibonacci)數列的第 n 項。斐波那契數列的定義如下:

F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.

斐波那契數列由 0 和 1 開始,之後的斐波那契數就是由之前的兩數相加而得出。

答案需要取模 1e9+7(1000000007),如計算初始結果為:1000000008,請返回 1。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/fei-bo-na-qi-shu-lie-lcof
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

在這道題目中如果不加入快取機制,則會超時,使用快取機制可通過

python3解法

from functools import lru_cache
class Solution:
    @lru_cache(None)
    def fib(self, n: int) -> int:
        if n<2:
            return n
        return (self.fib(n-1)+self.fib(n-2))%1000000007

 

相關文章