Python緩存技術(shù)實(shí)現(xiàn)過程詳解
一段非常簡單代碼
普通調(diào)用方式
def console1(a, b): print("進(jìn)入函數(shù)") return (a, b) print(console1(3, 'a')) print(console1(2, 'b')) print(console1(3.0, 'a'))
很簡單的一段代碼,傳入兩個(gè)參數(shù)。然后打印輸出。輸出結(jié)果
進(jìn)入函數(shù) (3, 'a') 進(jìn)入函數(shù) (2, 'b') 進(jìn)入函數(shù) (3.0, 'a')
使用某個(gè)裝飾器后
接下來我們引入functools模塊的lru_cache,python3自帶模塊。
from functools import lru_cache @lru_cache() def console2(a, b): print("進(jìn)入函數(shù)") return (a, b) print(console2(3, 'a')) print(console2(2, 'b')) print(console2(3.0, 'a'))
ほら、驚喜來了。
進(jìn)入函數(shù) (3, 'a') 進(jìn)入函數(shù) (2, 'b') (3, 'a')
我們發(fā)現(xiàn),少了一次進(jìn)入函數(shù)的打印,這是怎么回事呢?這就是接下來要說的LRU緩存技術(shù)了。
我們理解下什么是LRU
LRU (Least Recently Used) 是緩存置換策略中的一種常用的算法。當(dāng)緩存隊(duì)列已滿時(shí),新的元素加入隊(duì)列時(shí),需要從現(xiàn)有隊(duì)列中移除一個(gè)元素,LRU 策略就是將最近最少被訪問的元素移除,從而騰出空間給新的元素。
python中的實(shí)現(xiàn)
python3中的functools模塊的lru_cache實(shí)現(xiàn)了這個(gè)功能,lru_cache裝飾器會(huì)記錄以往函數(shù)運(yùn)行的結(jié)果,實(shí)現(xiàn)了備忘(memoization)功能,避免參數(shù)重復(fù)時(shí)反復(fù)調(diào)用,達(dá)到提高性能的作用,在遞歸函數(shù)中作用特別明顯。這是一項(xiàng)優(yōu)化技術(shù),它把耗時(shí)的函數(shù)的結(jié)果保存起來,避免傳入相同的參數(shù)時(shí)重復(fù)計(jì)算。
帶參數(shù)的lru_cache
使用方法lru_cache(maxsize=128, typed=False)maxsize可以緩存最多個(gè)此函數(shù)的調(diào)用結(jié)果,從而提高程序執(zhí)行的效率,特別適合于耗時(shí)的函數(shù)。參數(shù)maxsize為最多緩存的次數(shù),如果為None,則無限制,設(shè)置為2的n次冪時(shí),性能最佳;如果 typed=True,則不同參數(shù)類型的調(diào)用將分別緩存,例如 f(3) 和 f(3.0),默認(rèn)False來一段綜合代碼:
from functools import lru_cache def console1(a, b): print("進(jìn)入函數(shù)") return (a, b) @lru_cache() def console2(a, b): print("進(jìn)入函數(shù)") return (a, b) @lru_cache(maxsize=256, typed=True) def console3(a, b): ''' :param a: :param b: :return: ''' print("進(jìn)入函數(shù)") return (a, b) print(console1(3, 'a')) print(console1(2, 'b')) print(console1(3.0, 'a')) print("*" * 40) print(console2(3, 'a')) print(console2(2, 'b')) print(console2(3.0, 'a')) print("*" * 40) print(console3(3, 'a')) print(console3(2, 'b')) print(console3(3.0, 'a'))
同樣的可以用到爬蟲的去重操作上,避免網(wǎng)頁的重復(fù)請(qǐng)求。在后期存儲(chǔ)的時(shí)候做判斷即可。
from functools import lru_cache from requests_html import HTMLSession session=HTMLSession() @lru_cache() def get_html(url): req=session.get(url) print(url) return req urllist=["https://www.baidu.com","https://pypi.org/project/pylru/1.0.9/","https://www.baidu.com"] if __name__ == '__main__': for i in urllist: print(get_html(i))
輸出
https://www.baidu.com <Response [200]> https://pypi.org/project/pylru/1.0.9/ <Response [200]> <Response [200]>
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
TensorFlow和Numpy矩陣操作中axis理解及axis=-1的解釋
在調(diào)用numpy庫中的concatenate()時(shí),有遇到axis=-1/1/0的情況,下面這篇文章主要給大家介紹了關(guān)于TensorFlow和Numpy矩陣操作中axis理解及axis=-1解釋的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03幫你快速上手Jenkins并實(shí)現(xiàn)自動(dòng)化部署
在未學(xué)習(xí)Jenkins之前,只是對(duì)Jenkins有一個(gè)比較模糊的理解,即Jenkins是一個(gè)自動(dòng)化構(gòu)建項(xiàng)目發(fā)布的工具,可以實(shí)現(xiàn)代碼->github或者gitlab庫->jenkins自動(dòng)部署->訪問的整體的過程,而無需人為重新打包,今天就帶大家詳細(xì)了解一下,幫你快速上手Jenkins,需要的朋友可以參考下2021-06-06python神經(jīng)網(wǎng)絡(luò)TensorFlow簡介常用基本操作教程
這篇文章主要介紹了python神經(jīng)網(wǎng)絡(luò)入門TensorFlow簡介常用基本操作教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11Python+Selenium自動(dòng)化實(shí)現(xiàn)分頁(pagination)處理
這篇文章主要為大家詳細(xì)介紹了Python+Selenium自動(dòng)化實(shí)現(xiàn)分頁pagination處理的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03Python實(shí)現(xiàn)批量修改xml文件的腳本
這篇文章主要為大家詳細(xì)介紹了如何通過Python實(shí)現(xiàn)批量修改xml文件功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-11-11Python+Pygame實(shí)現(xiàn)經(jīng)典魂斗羅游戲
《魂斗羅》(Contra)是由Konami于1987年推出的一系列卷軸射擊類單機(jī)游戲。本文將利用Python中的Pygame庫實(shí)現(xiàn)這一經(jīng)典游戲,感興趣的可以了解一下2022-05-05python中幾個(gè)常用函數(shù)的正確用法-lambda/filter/map/reduce
這篇文章主要介紹了python中幾個(gè)常用函數(shù)的正確用法,這幾個(gè)常用函數(shù)包括lambda、filter、map、reduce,本文將圍繞這幾個(gè)常用函數(shù)展開內(nèi)容,需要的朋友可以參考一下2021-11-11