windows7龍芯系統(tǒng)的簡(jiǎn)單介紹

python 緩存

詳解:

10年積累的成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)制作后付款的網(wǎng)站建設(shè)流程,更有饒陽(yáng)免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

一.

1.int 類型的緩存

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

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

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

python3_原生 LRU 緩存

原生 LRU 緩存(最低 Python 版本為 3.2)

目前,幾乎所有層面上的軟件和硬件中都需要緩存。Python 3 將 LRU(最近最少使用算法)緩存作為一個(gè)名為「lru_cache」的裝飾器,使得對(duì)緩存的使用非常簡(jiǎn)單。

下面是一個(gè)簡(jiǎn)單的斐波那契函數(shù),我們知道使用緩存將有助于該函數(shù)的計(jì)算,因?yàn)樗鼤?huì)通過(guò)遞歸多次執(zhí)行相同的工作。

現(xiàn)在,我們可以使用「lru_cache」來(lái)優(yōu)化它(這種優(yōu)化技術(shù)被稱為「memoization」)。通過(guò)這種優(yōu)化,我們將執(zhí)行時(shí)間從幾十秒降低到了幾秒。

python 緩存記憶化 @lru_cache()

使用裝飾器lru_cache加速函數(shù)計(jì)算

lru是一種緩存淘汰算法

(least recently used)即最近最少使用淘汰算法

不用lru_cache

使用lru_cache

lru_cache的定義如下,

第一個(gè)參數(shù)maxsize控制最大緩存數(shù)量,

第二個(gè)參數(shù)為T(mén)rue則嚴(yán)格檢查被裝飾函數(shù)的參數(shù)類型

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

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

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

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

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

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

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

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

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

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

執(zhí)行時(shí)間

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

執(zhí)行時(shí)間

兩個(gè)差距是非常明顯的,因?yàn)椴皇褂镁彺鏁r(shí),相當(dāng)于要重復(fù)執(zhí)行了很多的函數(shù),而使用了 lru_cache 則把之前執(zhí)行的函數(shù)結(jié)果已經(jīng)緩存了起來(lái),就不需要再次執(zhí)行了。

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

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

默認(rèn)為false,代表不區(qū)分?jǐn)?shù)據(jù)類型,如果設(shè)置為T(mén)rue,則會(huì)區(qū)分傳參類型進(jìn)行緩存,官方是這樣描述的:

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

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

但如果是多參數(shù)的情況下,則會(huì)被當(dāng)成一個(gè)結(jié)果:

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

這個(gè)時(shí)候設(shè)置typed為true時(shí),則會(huì)區(qū)別緩存:

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

當(dāng)傳參個(gè)數(shù)大于1時(shí),才符合官方的說(shuō)法,不清楚是不是官方舉例有誤

當(dāng)傳遞的參數(shù)是dict、list等的可變參數(shù)時(shí),lru_cache是不支持的,會(huì)報(bào)錯(cuò):

報(bào)錯(cuò)結(jié)果

緩存 緩存位置 是否支持可變參數(shù) 是否支持分布式 是否支持過(guò)期時(shí)間設(shè)置 支持的數(shù)據(jù)結(jié)構(gòu) 需單獨(dú)安裝 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)過(guò)上面的分析,lru_cache 功能相對(duì)于redis來(lái)說(shuō)要簡(jiǎn)單許多,但使用起來(lái)更加方便,適用于小型的單體應(yīng)用。如果涉及的緩存的數(shù)據(jù)種類比較多并且想更好的管理緩存、或者需要緩存數(shù)據(jù)有過(guò)期時(shí)間(類似登錄驗(yàn)證的token)等,使用redis是優(yōu)于lru_cache的。

網(wǎng)站欄目:windows7龍芯系統(tǒng)的簡(jiǎn)單介紹
當(dāng)前網(wǎng)址:http://muchs.cn/article0/phihio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、標(biāo)簽優(yōu)化、定制網(wǎng)站、云服務(wù)器服務(wù)器托管、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司