主頁 > 知識(shí)庫 > Python 的lru_cache裝飾器使用簡(jiǎn)介

Python 的lru_cache裝飾器使用簡(jiǎn)介

熱門標(biāo)簽:電話運(yùn)營中心 百度AI接口 Win7旗艦版 客戶服務(wù) 語音系統(tǒng) 企業(yè)做大做強(qiáng) 呼叫中心市場(chǎng)需求 硅谷的囚徒呼叫中心

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 n2:
  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)行性能比較分析。它是一種確定性分析器,只測(cè)量 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ù)與整型。
注意:由于使用了字典來存儲(chǔ)緩存,所以所裝飾的函數(shù)參數(shù)必須是可哈希的。
利用 cache_info() 函數(shù),我們還可以看到命中次數(shù) hits,未命中次數(shù) misses ,最大緩存數(shù)量 maxsize 和 當(dāng)前緩存大小 currsize。使用方式是直接調(diào)用被裝飾函數(shù)的 cache_info(),形如:fibonacci.cache_info())。

只要某個(gè)函數(shù)遞歸調(diào)用并存在重復(fù)計(jì)算的情況,這時(shí)就要記著使用 lru_cache 這個(gè)性能加速器。

以上就是Python 的lru_cache 裝飾器使用簡(jiǎn)介的詳細(xì)內(nèi)容,更多關(guān)于Python 的lru_cache 裝飾器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • Python中l(wèi)ru_cache的使用和實(shí)現(xiàn)詳解
  • Python實(shí)現(xiàn)的一個(gè)簡(jiǎn)單LRU cache
  • python自帶緩存lru_cache用法及擴(kuò)展的使用

標(biāo)簽:長沙 山西 山西 崇左 海南 喀什 安康 濟(jì)南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Python 的lru_cache裝飾器使用簡(jiǎn)介》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266