久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

您的位置:首頁技術(shù)文章
文章詳情頁

Python 的lru_cache裝飾器使用簡介

瀏覽:2日期:2022-06-24 18:46:39

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@clockdef 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é)果:

Python 的lru_cache裝飾器使用簡介

其中的 clock_decorator 實現(xiàn)是一個可以輸出某個函數(shù)運行時長的裝飾器1。

從輸出結(jié)果中可以看出,存在著嚴(yán)重的重復(fù)計算情況,比如 fibonacci(1) 就被計算了 5 次之多。這還只是計算 6 次的 fibonacci 函數(shù)。

2 優(yōu)化

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

Python 的lru_cache裝飾器使用簡介

運行結(jié)果:

Python 的lru_cache裝飾器使用簡介

這次不存在重復(fù)計算現(xiàn)象,因此性能得到極大的提升。

3 比較

利用 cProfile 進行性能比較分析。它是一種確定性分析器,只測量 CPU 時間,并不包含內(nèi)存消耗和其他與內(nèi)存相關(guān)聯(lián)的信息2。

假設(shè)我們需要計算 fibonacci(33) 求和值。

(1)不使用 lru_cache 裝飾器

Python 的lru_cache裝飾器使用簡介

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

(2)使用了 lru_cache 裝飾器

Python 的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ù) 默認(rèn)值 說明 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 和 當(dāng)前緩存大小 currsize。使用方式是直接調(diào)用被裝飾函數(shù)的 cache_info(),形如:fibonacci.cache_info())。

Python 的lru_cache裝飾器使用簡介

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

以上就是Python 的lru_cache 裝飾器使用簡介的詳細(xì)內(nèi)容,更多關(guān)于Python 的lru_cache 裝飾器的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 宁强县| 南康市| 新乐市| 宜都市| 衢州市| 高台县| 静乐县| 弋阳县| 沛县| 茶陵县| 遵义县| 白城市| 鹰潭市| 花垣县| 信丰县| 晋州市| 呼和浩特市| 山丹县| 沾益县| 农安县| 镇平县| 闽清县| 尼勒克县| 兴宁市| 杂多县| 石首市| 承德市| 嘉鱼县| 姜堰市| 天门市| 平利县| 驻马店市| 阿图什市| 普兰店市| 剑河县| 毕节市| 扶风县| 剑川县| 会同县| 沈丘县| 永丰县|