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