Python 的lru_cache裝飾器使用簡介
Python 的 lru_cache 裝飾器是一個為自定義函數(shù)提供緩存功能的裝飾器。其內(nèi)部會在下次以相同參數(shù)調(diào)用該自定義函數(shù)時直接返回計算好的結(jié)果。通過緩存計算結(jié)果可以很好地提升性能。
1 從示例說起
假設(shè)我們有一個計算斐波那契數(shù)列的求和函數(shù),其內(nèi)部采用遞歸方式實現(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))
運行結(jié)果:

其中的 clock_decorator 實現(xiàn)是一個可以輸出某個函數(shù)運行時長的裝飾器1。
從輸出結(jié)果中可以看出,存在著嚴重的重復(fù)計算情況,比如 fibonacci(1) 就被計算了 5 次之多。這還只是計算 6 次的 fibonacci 函數(shù)。
2 優(yōu)化
上面的示例代碼加入 lru_cache 裝飾器:

運行結(jié)果:

這次不存在重復(fù)計算現(xiàn)象,因此性能得到極大的提升。
3 比較
利用 cProfile 進行性能比較分析。它是一種確定性分析器,只測量 CPU 時間,并不包含內(nèi)存消耗和其他與內(nèi)存相關(guān)聯(lián)的信息2。
假設(shè)我們需要計算 fibonacci(33) 求和值。
(1)不使用 lru_cache 裝飾器

這個遞歸函數(shù)內(nèi)部總共調(diào)用了 1000 多萬次的 fibonacci() 函數(shù)!
(2)使用了 lru_cache 裝飾器

使用了 lru_cache 裝飾器之后,這個遞歸函數(shù)只需調(diào)用 100 多次fibonacci() 函數(shù)!性能有了質(zhì)的提升。
4 lru_cache 裝飾器
lru_cache 裝飾器支持兩個入?yún)?,它的完整定義格式為3: @functools.lru_cache(maxsize=128, typed=False)
| 參數(shù) | 默認值 | 說明 |
| maxsize | 128 | 表示緩存大小。如果設(shè)置為 None,則不限大??;如果超過緩存大小,則使用 LRU 策略清理緩存。緩存的大小限制可確保緩存不會無限制增長。LRU(Least Recently Used),即刪除最近最少使用的緩存數(shù)據(jù)。 |
| typed | False | 如果為true,不同類型的參數(shù)將會被分別緩存,比如區(qū)分浮點數(shù)與整型。 |

只要某個函數(shù)遞歸調(diào)用并存在重復(fù)計算的情況,這時就要記著使用 lru_cache 這個性能加速器。
以上就是Python 的lru_cache 裝飾器使用簡介的詳細內(nèi)容,更多關(guān)于Python 的lru_cache 裝飾器的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python使用clear方法清除字典內(nèi)全部數(shù)據(jù)實例
這篇文章主要介紹了python使用clear方法清除字典內(nèi)全部數(shù)據(jù),實例分析了Python中clear方法清空字典內(nèi)數(shù)據(jù)的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07
python Boltons庫實用功能探索(深度復(fù)制類型檢查重試機制)
這篇文章主要為大家介紹了python Boltons庫實用功能探索包含深度復(fù)制類型檢查重試機制及數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01
Python保存dict字典類型數(shù)據(jù)到Mysql并自動創(chuàng)建表與列
這篇文章主要介紹了Python保存dict字典類型數(shù)據(jù)到Mysql并自動創(chuàng)建表與列,字典是另一種可變?nèi)萜髂P?,且可存儲任意類型對象,想了解更多?nèi)容的小伙伴可以和小編一起進入下面文章學(xué)習(xí)更多內(nèi)容,希望對你有所幫助2022-02-02
python pyecharts 實現(xiàn)一個文件繪制多張圖
這篇文章主要介紹了python pyecharts 實現(xiàn)一個文件繪制多張圖,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Python操作Mongodb數(shù)據(jù)庫的方法小結(jié)
這篇文章主要介紹了Python操作Mongodb數(shù)據(jù)庫的方法,結(jié)合實例形式總結(jié)分析了Python針對MongoDB數(shù)據(jù)庫的基本模塊導(dǎo)入、連接、增刪改查及排序等相關(guān)操作技巧,需要的朋友可以參考下2019-09-09
解決pycharm最左側(cè)Tool Buttons顯示不全的問題
今天小編就為大家分享一篇解決pycharm最左側(cè)Tool Buttons顯示不全的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
解決python中用matplotlib畫多幅圖時出現(xiàn)圖形部分重疊的問題
今天小編就為大家分享一篇解決python中用matplotlib畫多幅圖時出現(xiàn)圖形部分重疊的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07

