眾所周知,python語言是相當(dāng)好用的,但是它的執(zhí)行性能也是相對(duì)其他語言比較慢的。還好python提供了一個(gè)非常優(yōu)秀的裝飾器來解決這個(gè)問題,它就是lru_cache裝飾器。lru_cache是通過著名的LCU算法來實(shí)現(xiàn)的,也就是最近最久未使用緩存淘汰算法。
創(chuàng)新互聯(lián)建站主營(yíng)平城網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,重慶APP軟件開發(fā),平城h5微信平臺(tái)小程序開發(fā)搭建,平城網(wǎng)站營(yíng)銷推廣歡迎平城等地區(qū)企業(yè)咨詢
【閱讀全文】
為了形成明顯的對(duì)比,使用普通的方式來實(shí)現(xiàn)一個(gè)函數(shù)的遞歸過程,即不添加任何的裝飾器來實(shí)現(xiàn)。
def func(n):
'''
遞歸樣例函數(shù)、未添加lru_cache裝飾器
:param n:
:return:
'''
if n <= 1:
return n
return func(n - 1) + func(n - 2)
接下來,再使用 lru_cache 裝飾器的方式實(shí)現(xiàn)一遍,首先,導(dǎo)入需要裝飾器模塊。
from functools import lru_cache
過程比較簡(jiǎn)單,這樣準(zhǔn)備工作就完成。然后,在代碼塊中直接引用即可。
@lru_cache
def func(n):
'''
遞歸樣例函數(shù)、添加lru_cache裝飾器
:param n:
:return:
'''
if n <= 1:
return n
return func(n - 1) + func(n - 2)
如上述代碼所示,只需要在函數(shù)定義的部分加入裝飾器的修飾大功告成了。
最后,只需要寫一個(gè)main函數(shù)分別調(diào)用這兩個(gè)函數(shù)就會(huì)出現(xiàn)顯而易見的效果。
import time
'''
測(cè)試消耗時(shí)間
'''
if __name__ == '__main__':
start_time = time.time()
result = func(10)
end_time = time.time()
cost_time = end_time - start_time
print('result is ' + str(result),'cost_time is ' + str(cost_time))
通過上面@lru_cache的使用實(shí)例,可以清楚的發(fā)現(xiàn)cost_time is 0.0,時(shí)間上的消耗基本可以忽略不計(jì)。而在不使用此裝飾器的情況下運(yùn)算了半天都沒有出來結(jié)果,效果是顯而易見的。
@lru_cache 裝飾器使用大致來講就是將每次遞歸計(jì)算的數(shù)據(jù)結(jié)果作為 hash 緩存記錄,當(dāng)再次需要這個(gè)結(jié)果的時(shí)候就直接從緩存的數(shù)據(jù)中將結(jié)果取出避免重復(fù)計(jì)算的性能消耗。它的底層實(shí)現(xiàn)也牽扯到雙向鏈表、hash表等實(shí)現(xiàn)處理過程,更深層次的LCU算法原理大家可以學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)+算法的一些常規(guī)知識(shí)。
【往期推薦】
冒泡排序、選擇排序之間的比較與代碼實(shí)現(xiàn)!
如何通過pynput與日志記錄實(shí)現(xiàn)鍵盤、鼠標(biāo)的監(jiān)聽行為?
如果你是一名java程序員,面對(duì)已經(jīng)寫好的python腳本該如何調(diào)用,其實(shí)很簡(jiǎn)單!
如何使用PyQt5一步步實(shí)現(xiàn)用戶登錄GUI界面、登錄后跳轉(zhuǎn)?
辦公自動(dòng)化:幾行代碼將PDF文檔轉(zhuǎn)換為WORD文檔(代碼實(shí)戰(zhàn))!