Python緩存技術(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'))
很簡單的一段代碼,傳入兩個參數(shù)。然后打印輸出。輸出結(jié)果
進(jìn)入函數(shù) (3, 'a') 進(jìn)入函數(shù) (2, 'b') 進(jìn)入函數(shù) (3.0, 'a')
使用某個裝飾器后
接下來我們引入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)緩存隊列已滿時,新的元素加入隊列時,需要從現(xiàn)有隊列中移除一個元素,LRU 策略就是將最近最少被訪問的元素移除,從而騰出空間給新的元素。
python中的實現(xiàn)
python3中的functools模塊的lru_cache實現(xiàn)了這個功能,lru_cache裝飾器會記錄以往函數(shù)運行的結(jié)果,實現(xiàn)了備忘(memoization)功能,避免參數(shù)重復(fù)時反復(fù)調(diào)用,達(dá)到提高性能的作用,在遞歸函數(shù)中作用特別明顯。這是一項優(yōu)化技術(shù),它把耗時的函數(shù)的結(jié)果保存起來,避免傳入相同的參數(shù)時重復(fù)計算。
帶參數(shù)的lru_cache
使用方法lru_cache(maxsize=128, typed=False)maxsize可以緩存最多個此函數(shù)的調(diào)用結(jié)果,從而提高程序執(zhí)行的效率,特別適合于耗時的函數(shù)。參數(shù)maxsize為最多緩存的次數(shù),如果為None,則無限制,設(shè)置為2的n次冪時,性能最佳;如果 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ù)請求。在后期存儲的時候做判斷即可。
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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python基于SMTP協(xié)議實現(xiàn)發(fā)送郵件功能詳解
這篇文章主要介紹了Python基于SMTP協(xié)議實現(xiàn)發(fā)送郵件功能,結(jié)合實例形式分析了Python使用SMTP協(xié)議實現(xiàn)郵件發(fā)送的相關(guān)操作技巧,并總結(jié)分析了Python發(fā)送純文本郵件、郵件附件、圖片郵件等相關(guān)操作技巧,需要的朋友可以參考下2018-08-08
python實現(xiàn)幾種歸一化方法(Normalization Method)
這篇文章主要介紹了python實現(xiàn)幾種歸一化方法(Normalization Method),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Python基礎(chǔ)學(xué)習(xí)函數(shù)+模塊+類
這篇文章主要介紹了Python基礎(chǔ)學(xué)習(xí)函數(shù)+模塊+類,這是基礎(chǔ)學(xué)習(xí)的第三篇內(nèi)容,小編已把前兩篇鏈接放在下面,需要學(xué)習(xí)的同學(xué)可以參考一下2022-05-05
Python?dateutil庫簡化日期時間處理利器使用場景實踐
在Python中,處理日期和時間是常見的任務(wù)之一,dateutil庫是Python標(biāo)準(zhǔn)庫中datetime模塊的擴(kuò)展,提供了許多方便的工具和函數(shù),簡化了日期和時間的操作2023-12-12
Python將Excel表格按某列拆分為多個sheet實現(xiàn)過程
這篇文章主要為大家介紹了Python實現(xiàn)將Excel表格按某列拆分為多個sheet,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05

