說說 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é)果中可以看出,存在著嚴重的重復計算情況呛每,比如 fibonacci(1) 就被計算了 5 次之多踩窖。這還只是計算 6 次的 fibonacci 函數(shù)。

2 優(yōu)化

上面的示例代碼加入 lru_cache 裝飾器:


運行結(jié)果:


這次不存在重復計算現(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)ⅲ耐暾x格式為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ù)參數(shù)必須是可哈希的唠粥。

利用 cache_info() 函數(shù),我們還可以看到命中次數(shù) hits停做,未命中次數(shù) misses 晤愧,最大緩存數(shù)量 maxsize 和 當前緩存大小 currsize。使用方式是直接調(diào)用被裝飾函數(shù)的 cache_info()蛉腌,形如:fibonacci.cache_info())官份。


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


  1. 說說在 Python 中如何實現(xiàn)輸出指定函數(shù)運行時長的裝飾器.
  2. 說說如何使用 Python 的 cProfile 模塊分析代碼性能.
  3. Python docs lru_cache.
  4. Luciano Ramalho (作者)舅巷,安道羔味,吳珂 (譯者).流暢的Python[M].人民郵電出版社,2017:323-326.
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钠右,一起剝皮案震驚了整個濱河市赋元,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌飒房,老刑警劉巖搁凸,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異狠毯,居然都是意外死亡护糖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門嚼松,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嫡良,“玉大人,你說我怎么就攤上這事献酗〗源蹋” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵凌摄,是天一觀的道長羡蛾。 經(jīng)常有香客問我,道長锨亏,這世上最難降的妖魔是什么痴怨? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮器予,結(jié)果婚禮上浪藻,老公的妹妹穿的比我還像新娘。我一直安慰自己乾翔,他們只是感情好爱葵,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著反浓,像睡著了一般萌丈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雷则,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天辆雾,我揣著相機與錄音,去河邊找鬼月劈。 笑死度迂,一個胖子當著我的面吹牛藤乙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惭墓,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼坛梁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了腊凶?” 一聲冷哼從身側(cè)響起划咐,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吭狡,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丈莺,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡划煮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了缔俄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弛秋。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖俐载,靈堂內(nèi)的尸體忽然破棺而出蟹略,到底是詐尸還是另有隱情,我是刑警寧澤遏佣,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布挖炬,位于F島的核電站,受9級特大地震影響状婶,放射性物質(zhì)發(fā)生泄漏意敛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一膛虫、第九天 我趴在偏房一處隱蔽的房頂上張望草姻。 院中可真熱鬧,春花似錦稍刀、人聲如沸撩独。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽综膀。三九已至,卻和暖如春局齿,著一層夾襖步出監(jiān)牢的瞬間僧须,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工项炼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留担平,地道東北人示绊。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像暂论,于是被迫代替她去往敵國和親面褐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 本文的文字及圖片來源于網(wǎng)絡(luò),僅供學習取胎、交流使用,不具有任何商業(yè)用途,如有問題請及時聯(lián)系我們以作處理 最近閱讀《流暢...
    葡萄_ac1c閱讀 198評論 0 0
  • 人們總說時間會改變一切展哭,但是實際上你需要自己努力去改變! Python 小技巧 —— 用類寫裝飾器Python裝飾...
    BeautifulSoulpy閱讀 8,645評論 0 6
  • 緩存是一種將定量數(shù)據(jù)加以保存以備迎合后續(xù)獲取需求的處理方式闻蛀,旨在加快數(shù)據(jù)獲取的速度匪傍。數(shù)據(jù)的生成過程可能需要經(jīng)過計算...
    水之心閱讀 4,813評論 0 3
  • 使用裝飾器lru_cache加速函數(shù)計算lru是一種緩存淘汰算法(least recently used)即最近最...
    清晨我上馬閱讀 732評論 0 0
  • 部分細節(jié)自己改了點,也加了點自己例子觉痛,基本上屬于轉(zhuǎn)載役衡。轉(zhuǎn)載出處:https://my.oschina.net/le...
    洛克黃瓜閱讀 1,976評論 0 3