詳解:
創(chuàng)新互聯(lián)公司是由多位在大型網(wǎng)絡(luò)公司、廣告設(shè)計公司的優(yōu)秀設(shè)計人員和策劃人員組成的一個具有豐富經(jīng)驗的團(tuán)隊,其中包括網(wǎng)站策劃、網(wǎng)頁美工、網(wǎng)站程序員、網(wǎng)頁設(shè)計師、平面廣告設(shè)計師、網(wǎng)絡(luò)營銷人員及形象策劃。承接:網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計、網(wǎng)站改版、網(wǎng)頁設(shè)計制作、網(wǎng)站建設(shè)與維護(hù)、網(wǎng)絡(luò)推廣、數(shù)據(jù)庫開發(fā),以高性價比制作企業(yè)網(wǎng)站、行業(yè)門戶平臺等全方位的服務(wù)。
一.
1.int 類型的緩存
[-5, 256]的整型,只要Python解釋器一運行,這些數(shù)值就加載到了內(nèi)存
2.free_list:float、list、touple、dict等都是這種方式
當(dāng)一個對象引用計數(shù)為0時,按理說就應(yīng)該被垃圾回收了,但是Python不是這么做的,而是將對象放入到free_list鏈表里面。這樣,以后再去創(chuàng)建該對象時,不會重新開辟內(nèi)存,而是直接使用free_list里面的
我們經(jīng)常談?wù)摰木彺嬉辉~,更多的類似于將硬盤中的數(shù)據(jù)存放到內(nèi)存中以至于提高讀取速度,比如常說的redis,就經(jīng)常用來做數(shù)據(jù)的緩存。 Python的緩存(lru_cache)是一種裝飾在被執(zhí)行的函數(shù)上,將其執(zhí)行的結(jié)果緩存起來,當(dāng)下次請求的時候,如果請求該函數(shù)的傳參未變則直接返回緩存起來的結(jié)果而不再執(zhí)行函數(shù)的一種緩存裝飾器。
那它和redis的區(qū)別在哪?有什么優(yōu)勢?怎么使用? 下面為你講解
1.現(xiàn)在我們先不使用緩存來寫一個求兩數(shù)之和的函數(shù),并調(diào)用執(zhí)行它兩次:
執(zhí)行結(jié)果
可以看到 test 被執(zhí)行了兩次,現(xiàn)在我們加上緩存再進(jìn)行執(zhí)行:
執(zhí)行結(jié)果
可以看到 test 函數(shù)只被執(zhí)行了一次,第二次的調(diào)用直接輸出了結(jié)果,使用了緩存起來的值。
2.當(dāng)我們使用遞歸求斐波拉契數(shù)列 (斐波那契數(shù)列指的是這樣一個數(shù)列:0,1,1,2,3,5,8,它從第3項開始,每一項都等于前兩項之和) 的時候,緩存對性能的提升就尤其明顯了:
不使用緩存求第40項的斐波拉契數(shù)列
執(zhí)行時間
使用緩存求第40項的斐波拉契數(shù)列:
執(zhí)行時間
兩個差距是非常明顯的,因為不使用緩存時,相當(dāng)于要重復(fù)執(zhí)行了很多的函數(shù),而使用了 lru_cache 則把之前執(zhí)行的函數(shù)結(jié)果已經(jīng)緩存了起來,就不需要再次執(zhí)行了。
查看lru_cache源碼會發(fā)現(xiàn)它可以傳遞兩個參數(shù): maxsize 、 typed :
代表被lru_cache裝飾的方法最大可緩存的結(jié)果數(shù)量 (被裝飾方法傳參不同一樣,則結(jié)果不一樣;如果傳參一樣則為同一個結(jié)果) , 如果不指定傳參則默認(rèn)值為128,表示最多緩存128個返回結(jié)果,當(dāng)達(dá)到了128個時,有新的結(jié)果要保存時,則會刪除最舊的那個結(jié)果。如果maxsize傳入為None則表示可以緩存無限個結(jié)果;
默認(rèn)為false,代表不區(qū)分?jǐn)?shù)據(jù)類型,如果設(shè)置為True,則會區(qū)分傳參類型進(jìn)行緩存,官方是這樣描述的:
但在python3.9.8版本下進(jìn)行測試,typed為false時,按照官方的測試方法測試得到的還是會被當(dāng)成不同的結(jié)果處理,這個時候typed為false還是為true都會區(qū)別緩存,這與官方文檔的描述存在差異:
執(zhí)行結(jié)果
但如果是多參數(shù)的情況下,則會被當(dāng)成一個結(jié)果:
執(zhí)行結(jié)果
這個時候設(shè)置typed為true時,則會區(qū)別緩存:
執(zhí)行結(jié)果
當(dāng)傳參個數(shù)大于1時,才符合官方的說法,不清楚是不是官方舉例有誤
當(dāng)傳遞的參數(shù)是dict、list等的可變參數(shù)時,lru_cache是不支持的,會報錯:
報錯結(jié)果
緩存 緩存位置 是否支持可變參數(shù) 是否支持分布式 是否支持過期時間設(shè)置 支持的數(shù)據(jù)結(jié)構(gòu) 需單獨安裝 redis 緩存在redis管理的內(nèi)存中 是 是 是 支持5種數(shù)據(jù)結(jié)構(gòu) 是 lru_cache 緩存在應(yīng)用進(jìn)程的內(nèi)存中,應(yīng)用被關(guān)閉則被清空 否 否 否 字典(參數(shù)為:key,結(jié)果為:value) 否
經(jīng)過上面的分析,lru_cache 功能相對于redis來說要簡單許多,但使用起來更加方便,適用于小型的單體應(yīng)用。如果涉及的緩存的數(shù)據(jù)種類比較多并且想更好的管理緩存、或者需要緩存數(shù)據(jù)有過期時間(類似登錄驗證的token)等,使用redis是優(yōu)于lru_cache的。
原生 LRU 緩存(最低 Python 版本為 3.2)
目前,幾乎所有層面上的軟件和硬件中都需要緩存。Python 3 將 LRU(最近最少使用算法)緩存作為一個名為「lru_cache」的裝飾器,使得對緩存的使用非常簡單。
下面是一個簡單的斐波那契函數(shù),我們知道使用緩存將有助于該函數(shù)的計算,因為它會通過遞歸多次執(zhí)行相同的工作。
現(xiàn)在,我們可以使用「lru_cache」來優(yōu)化它(這種優(yōu)化技術(shù)被稱為「memoization」)。通過這種優(yōu)化,我們將執(zhí)行時間從幾十秒降低到了幾秒。
網(wǎng)站標(biāo)題:python緩存函數(shù) python 文件緩存
網(wǎng)站鏈接:http://vcdvsql.cn/article34/dosdgse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、Google、網(wǎng)站建設(shè)、定制開發(fā)、電子商務(wù)、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)