導航:首頁 > 編程語言 > python模擬帶時間緩存

python模擬帶時間緩存

發布時間:2025-05-20 17:43:36

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

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

那它和redis的區別在哪?有什麼優勢?怎麼使用? 下面為你講解

1.現在我們先不使用緩存來寫一個求兩數之和的函數,並調用執行它兩次:

執行結果

可以看到 test 被執行了兩次,現在我們加上緩存再進行執行:

執行結果

可以看到 test 函數只被執行了一次,第二次的調用直接輸出了結果,使用了緩存起來的值。

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

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

執行時間

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

執行時間

兩個差距是非常明顯的,因為不使用緩存時,相當於要重復執行了很多的函數,而使用了 lru_cache 則把之前執行的函數結果已經緩存了起來,就不需要再次執行了。

查看lru_cache源碼會發現它可以傳遞兩個參數: maxsize 、 typed :

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

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

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

執行結果

但如果是多參數的情況下,則會被當成一個結果:

執行結果

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

執行結果

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

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

報錯結果

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

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

Ⅱ Python 爬蟲進階篇——diskcache緩存

在Python爬蟲進階篇中,我們深入探討了緩存技術,特別是diskcache,一個基於磁碟的緩存庫。本文旨在幫助提高爬蟲的效率,通過減少不必要的網路請求。diskcache的核心在於使用磁碟空間作為緩存,有效利用系統中可能被浪費的空餘磁碟空間,為爬蟲應用提供高效的數據存儲和檢索能力。



安裝與初始化


diskcache的安裝非常簡單,只需要通過Python的包管理工具即可完成。初始化diskcache時,只需提供目錄路徑,系統將自動創建所需的目錄結構,以確保緩存數據的安全存儲。



緩存操作


在diskcache中,創建和獲取緩存數據的操作簡單明了。初始化後,通過`diskcache.Cache`類輕松進行緩存的設置與獲取。設置緩存時,需要指定鍵值、值、過期時間、讀取模式、標簽和重試策略等參數。獲取緩存時,只需指定鍵值,diskcache將返回相應的緩存數據,若數據不存在,可設置默認返回值。



更新與添加緩存


diskcache提供`touch`方法用於更新緩存的時間戳,以及`add`方法用於在確保緩存不存在時添加新的數據。`add`方法的獨特之處在於它首先檢查緩存是否已過期,只有在緩存未過期或不存在的情況下才會添加新的數據,確保了數據的一致性和有效性。



增量與減量操作


對於需要數值操作的緩存場景,diskcache提供了`incr`和`decr`方法,用於實現數據的原子性增量和減量。這些方法確保在操作過程中數據的一致性和完整性,適用於需要實時更新計數器等場景。



刪除緩存


當不再需要某些緩存數據時,diskcache提供了`delete`和`pop`方法進行數據的刪除。`delete`方法用於刪除指定的鍵值,並返回操作是否成功的標志;`pop`方法則用於刪除指定鍵值的緩存並返回其值,若鍵值不存在則返回默認值。



過期緩存的處理


diskcache中的過期緩存不會被實際刪除,而是被系統過濾,以節省資源。如果需要清除大量過期緩存,可以使用`expire`方法,該方法允許指定刪除時間范圍,清理不再使用的數據,釋放磁碟空間。



總結與應用


總結來說,diskcache是一個功能強大、易於使用的磁碟緩存庫,特別適合Python爬蟲應用。它能夠顯著提高爬蟲的效率,減少重復請求,節省資源。對於爬取大型網站或進行腳本測試時,diskcache是不可或缺的工具,有助於構建更高效、更可持續的爬蟲系統。

Ⅲ python中的垃圾回收機制和緩存機制

在深入理解Python的垃圾回收機制之前,首先需明確兩個核心概念——內存泄漏與內存溢出。

內存泄漏指的是程序在使用完畢後,未能釋放的內存空間,導致這些空間長期被佔用,造成系統資源浪費和性能下降。而內存溢出則發生在程序請求分配內存時,因系統資源不足而無法得到滿足。

Python通過引用計數機制進行內存管理。在C語言源碼中,每個對象都擁有一個引用計數器,用於統計被引用的次數。程序運行時,引用計數實時更新。當引用計數降為0時,對象將被自動回收,釋放內存空間。使用sys.getrefcount()函數可以獲取對象的引用計數值。

然而,引用計數機制在處理循環引用時存在問題。當兩個對象相互引用,計數器無法降至0,導致內存泄漏。為解決此問題,Python採用標記-清除演算法。該演算法通過維護兩個雙端鏈表,分別存放需要掃描和已標記為不可達的對象。遍歷容器對象,解除循環引用影響後,將未標記可達的對象移至回收列表。再次遍歷時,移除未被引用的對象。

為了提高垃圾回收效率,Python引入分代回收機制。基於對象存在時間越長,成為垃圾的可能性越小的假設,減少回收過程中遍歷的對象數,從而加快回收速度。

Python還通過緩存機制優化內存管理。當對象的引用計數為0時,不直接回收內存,而是將其放入緩存列表中進行緩存。對於特定數據類型,如整數、浮點數、列表、字典、元組,Python分別採用free_list、緩存池和駐留機制進行優化,以減少內存分配和釋放的開銷,提高程序性能。

具體來說,free_list機制用於緩存特定數據類型(如整數、浮點數)的內存地址,以便重復使用;緩存池預先創建並存儲常用數據類型,如小整數、布爾類型、字元串;駐留機制通過字典存儲相同值的變數,避免重復內存分配,實現內存節省。

通過上述機制,Python的垃圾回收和緩存機制有效管理內存資源,提升程序運行效率,同時避免內存泄漏和內存溢出問題。

閱讀全文

與python模擬帶時間緩存相關的資料

熱點內容
javaweb事件 瀏覽:346
玩電競app怎麼接單 瀏覽:69
炫酷登錄第二季源碼 瀏覽:341
makefileshell命令 瀏覽:322
怎麼換安卓平台 瀏覽:684
牛津高階英漢雙解pdf 瀏覽:308
phpmysql防止注入 瀏覽:481
解壓的幾件小事 瀏覽:740
退出vi命令 瀏覽:109
無心pdf 瀏覽:67
vray渲染pdf 瀏覽:929
華為無法使用谷歌伺服器地址 瀏覽:283
壓縮機電磁離合器線圈燒 瀏覽:946
手機工行app怎麼交生活費 瀏覽:319
考研程序員考什麼專業好 瀏覽:98
phpmysqlsetutf8 瀏覽:49
使用Linux開發Android 瀏覽:884
前端源碼怎麼在瀏覽器瀏覽 瀏覽:30
php架構模式 瀏覽:365
itext5pdf 瀏覽:415