Python快取技術

2021-09-11 11:54:59 字數 2599 閱讀 8927

普通呼叫方式

def console1(a, b):

print("進入函式")

return (a, b)

print(console1(3, 'a'))

print(console1(2, 'b'))

print(console1(3.0, 'a'))

複製**

很簡單的一段**,傳入兩個引數。然後列印輸出。

輸出結果

進入函式

(3, 'a')

進入函式

(2, 'b')

進入函式

(3.0, 'a')

複製**

接下來我們引入functools模組的lru_cache,python3自帶模組。

from functools import lru_cache

@lru_cache()

def console2(a, b):

print("進入函式")

return (a, b)

print(console2(3, 'a'))

print(console2(2, 'b'))

print(console2(3.0, 'a'))

複製**

ほら、驚喜來了。

進入函式

(3, 'a')

進入函式

(2, 'b')

(3, 'a')

複製**

我們發現,少了一次進入函式的列印,這是怎麼回事呢?

這就是接下來要說的lru快取技術了。

lru (least recently used) 是快取置換策略中的一種常用的演算法。當快取佇列已滿時,新的元素加入佇列時,需要從現有佇列中移除乙個元素,lru 策略就是將最近最少被訪問的元素移除,從而騰出空間給新的元素。

python3中的functools模組的lru_cache實現了這個功能,

lru_cache裝飾器會記錄以往函式執行的結果,實現了備忘

(memoization)功能,避免引數重複時反覆呼叫,達到提高效能的作用,在遞迴函式中作用特別明顯。這是一項優化技術,它把耗時的函式的結果儲存起來,避免傳入相同的引數時重複計算。

使用方法lru_cache(maxsize=128, typed=false)

maxsize可以快取最多個此函式的呼叫結果,從而提高程式執行的效率,特別適合於耗時的函式。

引數maxsize為最多快取的次數,如果為none,則無限制,設定為2的n次冪時,效能最佳;

如果 typed=true,則不同引數型別的呼叫將分別快取,例如 f(3) 和 f(3.0),預設false

來一段綜合**:

from functools import lru_cache

def console1(a, b):

print("進入函式")

return (a, b)

@lru_cache()

def console2(a, b):

print("進入函式")

return (a, b)

@lru_cache(maxsize=256, typed=true)

def console3(a, b):

''' :param a:

:param b:

:return:

'''print("進入函式")

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'))

複製**

同樣的可以用到爬蟲的去重操作上,避免網頁的重複請求。

在後期儲存的時候做判斷即可。

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=["","",""]

if __name__ == '__main__':

for i in urllist:

print(get_html(i))

複製**

輸出

複製**

ok,今天的內容就到這裡,趕緊去試一試吧

python中的快取技術

def console a,b print 進入函式 return a,b print console 3,a print console 2,b print console 3.0,a 輸出結果 進入函式 3,a 進入函式 2,b 進入函式 3.0,a from functools import ...

Python快取技術實現過程詳解

一段非常簡單 普通呼叫方式 def console1 a,b print 進入函式 return a,b print console1 3,a print console1 2,b print console1 3.0,a 很簡單的一段 傳入兩個引數。然後列印輸出。輸出結果 進入函式 3,a 進入函...

php快取技術

一 引論 php,一門最近幾年興起的web設計指令碼語言,由於它的強大和可伸縮性,近幾年來得到長足的發展,php相比傳統的asp 在速度上有絕對的優勢,想 mssql轉6萬條資料php如需要40秒,asp不下2分鐘.但是,由於 的資料越來越多,我們渴求能更快速的呼叫資料,不必要每次都從資料庫掉,我們...