python緩存函數(shù) python 文件緩存

python 緩存

詳解:

創(chuàng)新互聯(lián)公司是由多位在大型網(wǎng)絡公司、廣告設計公司的優(yōu)秀設計人員和策劃人員組成的一個具有豐富經(jīng)驗的團隊,其中包括網(wǎng)站策劃、網(wǎng)頁美工、網(wǎng)站程序員、網(wǎng)頁設計師、平面廣告設計師、網(wǎng)絡營銷人員及形象策劃。承接:網(wǎng)站建設、成都網(wǎng)站設計、網(wǎng)站改版、網(wǎng)頁設計制作、網(wǎng)站建設與維護、網(wǎng)絡推廣、數(shù)據(jù)庫開發(fā),以高性價比制作企業(yè)網(wǎng)站、行業(yè)門戶平臺等全方位的服務。

一.

1.int 類型的緩存

[-5, 256]的整型,只要Python解釋器一運行,這些數(shù)值就加載到了內(nèi)存

2.free_list:float、list、touple、dict等都是這種方式

當一個對象引用計數(shù)為0時,按理說就應該被垃圾回收了,但是Python不是這么做的,而是將對象放入到free_list鏈表里面。這樣,以后再去創(chuàng)建該對象時,不會重新開辟內(nèi)存,而是直接使用free_list里面的

Python性能提升神器!lru_cache的介紹和講解

我們經(jīng)常談論的緩存一詞,更多的類似于將硬盤中的數(shù)據(jù)存放到內(nèi)存中以至于提高讀取速度,比如常說的redis,就經(jīng)常用來做數(shù)據(jù)的緩存。 Python的緩存(lru_cache)是一種裝飾在被執(zhí)行的函數(shù)上,將其執(zhí)行的結(jié)果緩存起來,當下次請求的時候,如果請求該函數(shù)的傳參未變則直接返回緩存起來的結(jié)果而不再執(zhí)行函數(shù)的一種緩存裝飾器。

那它和redis的區(qū)別在哪?有什么優(yōu)勢?怎么使用? 下面為你講解

1.現(xiàn)在我們先不使用緩存來寫一個求兩數(shù)之和的函數(shù),并調(diào)用執(zhí)行它兩次:

執(zhí)行結(jié)果

可以看到 test 被執(zhí)行了兩次,現(xiàn)在我們加上緩存再進行執(zhí)行:

執(zhí)行結(jié)果

可以看到 test 函數(shù)只被執(zhí)行了一次,第二次的調(diào)用直接輸出了結(jié)果,使用了緩存起來的值。

2.當我們使用遞歸求斐波拉契數(shù)列 (斐波那契數(shù)列指的是這樣一個數(shù)列:0,1,1,2,3,5,8,它從第3項開始,每一項都等于前兩項之和) 的時候,緩存對性能的提升就尤其明顯了:

不使用緩存求第40項的斐波拉契數(shù)列

執(zhí)行時間

使用緩存求第40項的斐波拉契數(shù)列:

執(zhí)行時間

兩個差距是非常明顯的,因為不使用緩存時,相當于要重復執(zhí)行了很多的函數(shù),而使用了 lru_cache 則把之前執(zhí)行的函數(shù)結(jié)果已經(jīng)緩存了起來,就不需要再次執(zhí)行了。

查看lru_cache源碼會發(fā)現(xiàn)它可以傳遞兩個參數(shù): maxsize 、 typed :

代表被lru_cache裝飾的方法最大可緩存的結(jié)果數(shù)量 (被裝飾方法傳參不同一樣,則結(jié)果不一樣;如果傳參一樣則為同一個結(jié)果) , 如果不指定傳參則默認值為128,表示最多緩存128個返回結(jié)果,當達到了128個時,有新的結(jié)果要保存時,則會刪除最舊的那個結(jié)果。如果maxsize傳入為None則表示可以緩存無限個結(jié)果;

默認為false,代表不區(qū)分數(shù)據(jù)類型,如果設置為True,則會區(qū)分傳參類型進行緩存,官方是這樣描述的:

但在python3.9.8版本下進行測試,typed為false時,按照官方的測試方法測試得到的還是會被當成不同的結(jié)果處理,這個時候typed為false還是為true都會區(qū)別緩存,這與官方文檔的描述存在差異:

執(zhí)行結(jié)果

但如果是多參數(shù)的情況下,則會被當成一個結(jié)果:

執(zhí)行結(jié)果

這個時候設置typed為true時,則會區(qū)別緩存:

執(zhí)行結(jié)果

當傳參個數(shù)大于1時,才符合官方的說法,不清楚是不是官方舉例有誤

當傳遞的參數(shù)是dict、list等的可變參數(shù)時,lru_cache是不支持的,會報錯:

報錯結(jié)果

緩存 緩存位置 是否支持可變參數(shù) 是否支持分布式 是否支持過期時間設置 支持的數(shù)據(jù)結(jié)構(gòu) 需單獨安裝 redis 緩存在redis管理的內(nèi)存中 是 是 是 支持5種數(shù)據(jù)結(jié)構(gòu) 是 lru_cache 緩存在應用進程的內(nèi)存中,應用被關閉則被清空 否 否 否 字典(參數(shù)為:key,結(jié)果為:value) 否

經(jīng)過上面的分析,lru_cache 功能相對于redis來說要簡單許多,但使用起來更加方便,適用于小型的單體應用。如果涉及的緩存的數(shù)據(jù)種類比較多并且想更好的管理緩存、或者需要緩存數(shù)據(jù)有過期時間(類似登錄驗證的token)等,使用redis是優(yōu)于lru_cache的。

python3_原生 LRU 緩存

原生 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)站標題:python緩存函數(shù) python 文件緩存
網(wǎng)站鏈接:http://muchs.cn/article34/dosdgse.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導航、Google、網(wǎng)站建設定制開發(fā)、電子商務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)

網(wǎng)站托管運營