Python 的lru_cache裝飾器使用簡介
Python 的 lru_cache 裝飾器是一個(gè)為自定義函數(shù)提供緩存功能的裝飾器。其內(nèi)部會(huì)在下次以相同參數(shù)調(diào)用該自定義函數(shù)時(shí)直接返回計(jì)算好的結(jié)果。通過緩存計(jì)算結(jié)果可以很好地提升性能。
1 從示例說起
假設(shè)我們有一個(gè)計(jì)算斐波那契數(shù)列的求和函數(shù),其內(nèi)部采用遞歸方式實(shí)現(xiàn)。
from xxx.clock_decorator import clock @clock def fibonacci(n): if n<2: return n return fibonacci(n-2)+fibonacci(n-1) if __name__=='__main__': logging.info('fibonacci(6) -> %s',fibonacci(6))
運(yùn)行結(jié)果:
其中的 clock_decorator 實(shí)現(xiàn)是一個(gè)可以輸出某個(gè)函數(shù)運(yùn)行時(shí)長的裝飾器1。
從輸出結(jié)果中可以看出,存在著嚴(yán)重的重復(fù)計(jì)算情況,比如 fibonacci(1) 就被計(jì)算了 5 次之多。這還只是計(jì)算 6 次的 fibonacci 函數(shù)。
2 優(yōu)化
上面的示例代碼加入 lru_cache 裝飾器:
運(yùn)行結(jié)果:
這次不存在重復(fù)計(jì)算現(xiàn)象,因此性能得到極大的提升。
3 比較
利用 cProfile 進(jìn)行性能比較分析。它是一種確定性分析器,只測量 CPU 時(shí)間,并不包含內(nèi)存消耗和其他與內(nèi)存相關(guān)聯(lián)的信息2。
假設(shè)我們需要計(jì)算 fibonacci(33) 求和值。
(1)不使用 lru_cache 裝飾器
這個(gè)遞歸函數(shù)內(nèi)部總共調(diào)用了 1000 多萬次的 fibonacci() 函數(shù)!
(2)使用了 lru_cache 裝飾器
使用了 lru_cache 裝飾器之后,這個(gè)遞歸函數(shù)只需調(diào)用 100 多次fibonacci() 函數(shù)!性能有了質(zhì)的提升。
4 lru_cache 裝飾器
lru_cache 裝飾器支持兩個(gè)入?yún)?,它的完整定義格式為3: @functools.lru_cache(maxsize=128, typed=False)
參數(shù) | 默認(rèn)值 | 說明 |
maxsize | 128 | 表示緩存大小。如果設(shè)置為 None,則不限大小;如果超過緩存大小,則使用 LRU 策略清理緩存。緩存的大小限制可確保緩存不會(huì)無限制增長。LRU(Least Recently Used),即刪除最近最少使用的緩存數(shù)據(jù)。 |
typed | False | 如果為true,不同類型的參數(shù)將會(huì)被分別緩存,比如區(qū)分浮點(diǎn)數(shù)與整型。 |
只要某個(gè)函數(shù)遞歸調(diào)用并存在重復(fù)計(jì)算的情況,這時(shí)就要記著使用 lru_cache 這個(gè)性能加速器。
以上就是Python 的lru_cache 裝飾器使用簡介的詳細(xì)內(nèi)容,更多關(guān)于Python 的lru_cache 裝飾器的資料請關(guān)注腳本之家其它相關(guān)文章!
- Python中緩存lru_cache的基本介紹和講解
- Python 如何手動(dòng)編寫一個(gè)自己的LRU緩存裝飾器的方法實(shí)現(xiàn)
- python自帶緩存lru_cache用法及擴(kuò)展的使用
- Python中l(wèi)ru_cache的使用和實(shí)現(xiàn)詳解
- 工程師必須了解的LRU緩存淘汰算法以及python實(shí)現(xiàn)過程
- python實(shí)現(xiàn)LRU熱點(diǎn)緩存及原理
- LRUCache的實(shí)現(xiàn)原理及利用python實(shí)現(xiàn)的方法
- Python實(shí)現(xiàn)LRU算法的2種方法
- Python實(shí)現(xiàn)的一個(gè)簡單LRU cache
- Python實(shí)現(xiàn)LRU算法
相關(guān)文章
python寫一個(gè)隨機(jī)點(diǎn)名軟件的實(shí)例
今天小編就為大家分享一篇python寫一個(gè)隨機(jī)點(diǎn)名軟件的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11PyQt5按下按鍵選擇文件夾并顯示的實(shí)現(xiàn)
這篇文章主要介紹了PyQt5按下按鍵選擇文件夾并顯示的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03Python中subprocess模塊用法實(shí)例詳解
這篇文章主要介紹了Python中subprocess模塊用法,實(shí)例分析了subprocess模塊的相關(guān)使用技巧,需要的朋友可以參考下2015-05-05學(xué)習(xí)Python3 Dlib19.7進(jìn)行人臉面部識別
本篇文章主要給大家詳細(xì)介紹了Python3利用Dlib19.7進(jìn)行人臉面部識別的相關(guān)知識,一起學(xué)習(xí)參考下吧。2018-01-01基于Python和openCV實(shí)現(xiàn)圖像的全景拼接詳細(xì)步驟
這篇文章主要介紹了基于Python和openCV實(shí)現(xiàn)圖像的全景拼接,本文分步驟通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-10-10Python softmax實(shí)現(xiàn)及數(shù)值穩(wěn)定性詳解
這篇文章主要為大家介紹了Python softmax實(shí)現(xiàn)及數(shù)值穩(wěn)定性詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07