德州極速網(wǎng)站建設百家號專業(yè)培訓心得體會
🚀 關于python的裝飾器原理介紹可看這里,講的挺簡潔易懂:python裝飾器原理
? 弄懂裝飾器原理后,來學學常用裝飾器。
文章目錄
- 1、@cache, @lru_cache
1、@cache, @lru_cache
也就是一種裝飾在被執(zhí)行的函數(shù)上,將其執(zhí)行的結果緩存起來,當下次請求的時候,如果請求該函數(shù)的傳參未變則直接返回緩存起來的結果而不再執(zhí)行函數(shù)的一種緩存裝飾器。
- Python 內(nèi)置模塊 functools 提供的高階函數(shù) @functools.cache 是簡單輕量級無長度限制的函數(shù)緩存,這種緩存有時稱為 “memoize”(記憶化)。它是 3.9 新版功能,是在 lru_cache 緩存基礎上簡化了的對無限長度緩存。
- 語法為 @functools.cache(user_function),創(chuàng)建一個查找函數(shù)參數(shù)的字典的簡單包裝器。 因為它不需要移出舊值,緩存大小沒有限制,所以比帶有大小限制的 lru_cache() 更小更快。這個 @cache 裝飾器是 Python 3.9 版中的新功能,在此之前,您可以通過 @lru_cache(maxsize=None) 獲得相同的效果。
- lru_cache有兩個參數(shù):maxsize、typed。maxsize:如果不指定傳參則默認值為128,表示最多緩存128個返回結果,當達到了128個時,有新的結果要保存時,則會刪除最舊的那個結果。如果maxsize傳入為None則表示可以緩存無限個結果;typed默認為false,代表不區(qū)分數(shù)據(jù)類型,如果設置為True,則會區(qū)分傳參類型進行緩存,例如f(3.0)和f(3)將被視為不一樣的傳參。如果typed為True,則將分別緩存不同類型的參數(shù)。
以下是 cache 的實現(xiàn)源碼:
from functools import lru_cachedef cache(user_function, /):'Simple lightweight unbounded cache. Sometimes called "memoize".'return lru_cache(maxsize=None)(user_function)
看個例子來秒懂@cache的原理:
def test(a,b):print('開始計算a+b的值...')return a + b
print('1+2等于:', test(1, 2))
print('1+2等于:', test(1, 2))
# 開始計算a+b的值...
# 1+2等于: 3
# 開始計算a+b的值...
# 1+2等于: 3@lru_cache(maxsize=None) # 等價于@cache
def test(a,b):print('開始計算a+b的值...')return a + b
print('1+2等于:', test(1, 2))
print('1+2等于:', test(1, 2))
# 開始計算a+b的值...
# 1+2等于: 3
# 1+2等于: 3
? 可以@cache可用在dfs記憶化場景中。