最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python functools.lru_cache自動(dòng)緩存應(yīng)用小結(jié)

 更新時(shí)間:2026年02月11日 10:11:35   作者:atwdy  
lru_cache會(huì)為所有同名的函數(shù)全局維護(hù)一個(gè)獨(dú)立的緩存結(jié)構(gòu),不同函數(shù)之間的緩存空間不沖突,適用于所有相同輸入對(duì)應(yīng)相同輸出的確定性函數(shù),下面給大家介紹Python functools.lru_cache自動(dòng)緩存應(yīng)用,感興趣的朋友跟隨小編一起看看吧

基本介紹

lru_cache是Python3.2版本在functools標(biāo)準(zhǔn)模塊中引入的裝飾器,用于實(shí)現(xiàn)最近最少使用(Least Recently Used, LRU)緩存策略,適用于所有相同輸入對(duì)應(yīng)相同輸出的確定性函數(shù),即緩存函數(shù)的參數(shù)和返回值的映射,只要下次調(diào)用參數(shù)相同,就直接返回緩存的結(jié)果,不再執(zhí)行函數(shù)體。

工作原理:

  • 緩存命中:當(dāng)使用相同的參數(shù)調(diào)用被裝飾的函數(shù)時(shí),函數(shù)不會(huì)真正執(zhí)行,而是直接從緩存中返回結(jié)果。
  • 緩存未命中:當(dāng)參數(shù)不在緩存中時(shí),函數(shù)正常執(zhí)行,并將結(jié)果存入緩存。
  • 緩存淘汰:當(dāng)緩存(不同參數(shù)個(gè)數(shù))達(dá)到設(shè)定的最大容量(由 maxsize參數(shù)指定)時(shí),它會(huì)自動(dòng)淘汰最久未被使用的結(jié)果,以控制內(nèi)存占用。

可通過(guò)參數(shù)maxsize=n指定緩存的最大容量,參數(shù)值為None表示無(wú)限制緩存,會(huì)緩存所有不同參數(shù)組合的函數(shù)返回值,性能最優(yōu)但存在內(nèi)存溢出的風(fēng)險(xiǎn),根據(jù)實(shí)際情況設(shè)置。

在遞歸中的應(yīng)用

lru_cache雖然適用于所有確定性的函數(shù),但在遞歸場(chǎng)景中使用特別合適,因?yàn)檫f歸場(chǎng)景中往往需要重復(fù)計(jì)算相同的子問(wèn)題。以下面斐波那契數(shù)列為例:

def fib(num):
    if num == 0 or num == 1:
        return num
    return fib(num - 1) + fib(num - 2)

fib(5)對(duì)應(yīng)的遞歸樹(shù):

               fib(5)
               /      \
          fib(4)      fib(3)
         /     \       /    \
     fib(3)  fib(2)  fib(2) fib(1)
    /    \    /   \   /   \
 fib(2) f(1) f(1)f(0) f(1)f(0)
 /   \
f(1) f(0)

如果不使用緩存,fib(3)和fib(2)都被重復(fù)計(jì)算了多次,如果把這棵遞歸樹(shù)看成滿二叉樹(shù),fib(n)一共有n層,每層的節(jié)點(diǎn)數(shù)量分別為 2 0 2^0 20, 2 1 2^1 21, 2 2 2^2 22, …, 2 n 2^n 2n, 那么總的時(shí)間復(fù)雜度 O ( 2 n ) O(2^n) O(2n)。

如果使用了lru,函數(shù)會(huì)在第一次計(jì)算矩形標(biāo)記的fib(0),fib(1),…, fib(5)時(shí)將每個(gè)參數(shù)對(duì)應(yīng)的函數(shù)值緩存,也就是對(duì)于fib(5)的整個(gè)計(jì)算流程中,標(biāo)記的6個(gè)記錄在第一次計(jì)算時(shí)未命中緩存,會(huì)執(zhí)行函數(shù)并將這6個(gè)記錄的結(jié)果緩存,在后續(xù)計(jì)算中直接讀取圓形標(biāo)記的fib(1),fib(2),fib(3)的緩存,直接讀取3次緩存就可以直接結(jié)束整個(gè)函數(shù)。


對(duì)于上面的分析可使用被裝飾函數(shù)的cache_info方法輸出詳細(xì)的緩存信息查看:

from functools import lru_cache
@lru_cache(maxsize=None)
def fib(num):
    if num == 0 or num == 1:
        return num
    return fib(num - 1) + fib(num - 2)
print(fib(5))
print(fib.cache_info())

lru_cache裝飾的函數(shù)也會(huì)自動(dòng)同時(shí)綁定上cache_info方法,用于顯示整個(gè)函數(shù)計(jì)算過(guò)程中的緩存命中情況,返回4個(gè)字段,含義分別是:
1)hits:緩存命中次數(shù)
2)misses:緩存未命中次數(shù)
3)maxsize:緩存最大容量
4)currsize:當(dāng)前已緩存數(shù)量

緩存清空

lru_cache會(huì)為所有同名的函數(shù)全局維護(hù)一個(gè)獨(dú)立的緩存結(jié)構(gòu),不同函數(shù)之間的緩存空間不沖突。除非手動(dòng)cache_clear,否則緩存不會(huì)自動(dòng)清除。

到此這篇關(guān)于Python functools.lru_cache自動(dòng)緩存應(yīng)用小結(jié)的文章就介紹到這了,更多相關(guān)Python functools.lru_cache緩存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

江北区| 巫溪县| 称多县| 千阳县| 张北县| 海兴县| 新泰市| 自贡市| 湖南省| 南郑县| 元谋县| 望谟县| 大荔县| 新兴县| 诏安县| 化德县| 边坝县| 蕲春县| 淅川县| 凌源市| 山阳县| 湘乡市| 台安县| 甘谷县| 邵武市| 敦煌市| 信丰县| 白城市| 四川省| 锡林浩特市| 汝城县| 昆山市| 垫江县| 邯郸县| 垦利县| 晋城| 图木舒克市| 团风县| 大化| 安陆市| 蒙自县|