亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python中緩存lru_cache的基本介紹和講解

 更新時間:2022年01月28日 10:34:23   作者:曲鳥  
緩存是一種將定量數據加以保存以備迎合后續(xù)請求的處理方式,旨在加快數據的檢索速度,下面這篇文章主要給大家介紹了關于Python中緩存lru_cache的基本介紹和講解的相關資料,需要的朋友可以參考下

一、前言

我們經常談論的緩存一詞,更多的類似于將硬盤中的數據存放到內存中以至于提高讀取速度,比如常說的redis,就經常用來做數據的緩存。
Python的緩存(lru_cache)是一種裝飾在被執(zhí)行的函數上,將其執(zhí)行的結果緩存起來,當下次請求的時候,如果請求該函數的傳參未變則直接返回緩存起來的結果而不再執(zhí)行函數的一種緩存裝飾器。

那它和redis的區(qū)別在哪?有什么優(yōu)勢?怎么使用? 下面為你講解

二、舉例說明

1.現(xiàn)在我們先不使用緩存來寫一個求兩數之和的函數,并調用執(zhí)行它兩次:

def test(a, b):
    print('開始計算a+b的值...')
    return a + b


print('1+2等于:', test(1, 2))
print('1+2等于:', test(1, 2))

執(zhí)行結果

開始計算a+b的值...
1+2等于: 3
開始計算a+b的值...
1+2等于: 3

可以看到test被執(zhí)行了兩次,現(xiàn)在我們加上緩存再進行執(zhí)行:

from functools import lru_cache

@lru_cache
def test(a, b):
    print('開始計算a+b的值...')
    return a + b

print(test(1, 2))
print(test(1, 2))

執(zhí)行結果

開始計算a+b的值...
1+2等于: 3
1+2等于: 3

可以看到test函數只被執(zhí)行了一次,第二次的調用直接輸出了結果,使用了緩存起來的值。

2.當我們使用遞歸求斐波拉契數列 (斐波那契數列指的是這樣一個數列:0,1,1,2,3,5,8,它從第3項開始,每一項都等于前兩項之和) 的時候,緩存對性能的提升就尤其明顯了:

不使用緩存求第40項的斐波拉契數列

import datetime

def fibonacci(num):
	# 不使用緩存時,會重復執(zhí)行函數
    return num if num < 2 else fibonacci(num - 1) + fibonacci(num - 2)

start = datetime.datetime.now()
print(fibonacci(40))
end = datetime.datetime.now()
print('執(zhí)行時間', end - start)

執(zhí)行時間

執(zhí)行時間 0:00:29.004424

使用緩存求第40項的斐波拉契數列:

import datetime

def fibonacci(num):
	# 不使用緩存時,會重復執(zhí)行函數
    return num if num < 2 else fibonacci(num - 1) + fibonacci(num - 2)

start = datetime.datetime.now()
print(fibonacci(40))
end = datetime.datetime.now()
print('執(zhí)行時間', end - start)

執(zhí)行時間

執(zhí)行時間 0:00:00

兩個差距是非常明顯的,因為不使用緩存時,相當于要重復執(zhí)行了很多的函數,而使用了lru_cache則把之前執(zhí)行的函數結果已經緩存了起來,就不需要再次執(zhí)行了。

三、lru_cache 用法

1.參數詳解

查看lru_cache源碼會發(fā)現(xiàn)它可以傳遞兩個參數:maxsize、typed:

def lru_cache(maxsize=128, typed=False):
    """Least-recently-used cache decorator.

    If *maxsize* is set to None, the LRU features are disabled and the cache
    can grow without bound.
	...
	"""

1) maxsize

代表被lru_cache裝飾的方法最大可緩存的結果數量 (被裝飾方法傳參不同一樣,則結果不一樣;如果傳參一樣則為同一個結果), 如果不指定傳參則默認值為128,表示最多緩存128個返回結果,當達到了128個時,有新的結果要保存時,則會刪除最舊的那個結果。如果maxsize傳入為None則表示可以緩存無限個結果;

2)typed

默認為false,代表不區(qū)分數據類型,如果設置為True,則會區(qū)分傳參類型進行緩存,官方是這樣描述的:

如果typed為True,則將分別緩存不同類型的參數,
例如,f(3.0)和f(3)將被視為具有明顯的結果。

但在python3.9.8版本下進行測試,typed為false時,按照官方的測試方法測試得到的還是會被當成不同的結果處理,這個時候typed為false還是為true都會區(qū)別緩存,這與官方文檔的描述存在差異:

from functools import lru_cache

@lru_cache
def test(a):
    print('函數被調用了...')
    return a

print(test(1.0))
print(test(1))

執(zhí)行結果

函數被調用了...
1.0
函數被調用了...

但如果是多參數的情況下,則會被當成一個結果:

from functools import lru_cache

@lru_cache
def test(a, b):
    print('函數被調用了...')
    return a , b

print(test(1.0, 2.0))
print(test(1, 2))

執(zhí)行結果

函數被調用了...
(1.0, 2.0)
(1.0, 2.0)

這個時候設置typed為true時,則會區(qū)別緩存:

from functools import lru_cache

@lru_cache(typed=True)
def test(a, b):
    print('函數被調用了...')
    return a , b

print(test(1.0, 2.0))
print(test(1, 2))

執(zhí)行結果

函數被調用了...
(1.0, 2.0)
函數被調用了...
(1, 2)

當傳參個數大于1時,才符合官方的說法,不清楚是不是官方舉例有誤

2. lru_cache不支持可變參數

當傳遞的參數是dict、list等的可變參數時,lru_cache是不支持的,會報錯:

from functools import lru_cache

@lru_cache
def test(a):
    print('函數被執(zhí)行了...')
    return a

print(test({'a':1}))

報錯結果

TypeError: unhashable type: 'dict'

四、lru_cache 與redis的區(qū)別

緩存緩存位置是否支持可變參數是否支持分布式是否支持過期時間設置支持的數據結構需單獨安裝
redis緩存在redis管理的內存中支持5種數據結構
lru_cache緩存在應用進程的內存中,應用被關閉則被清空字典(參數為:key,結果為:value)

五、總結

經過上面的分析,lru_cache 功能相對于redis來說要簡單許多,但使用起來更加方便,適用于小型的單體應用。如果涉及的緩存的數據種類比較多并且想更好的管理緩存、或者需要緩存數據有過期時間(類似登錄驗證的token)等,使用redis是優(yōu)于lru_cache的。

到此這篇關于Python中緩存lru_cache的基本介紹和講解的文章就介紹到這了,更多相關Python中緩存lru_cache內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python return實現(xiàn)匯率轉換器教程示例

    python return實現(xiàn)匯率轉換器教程示例

    這篇文章主要為大家介紹了python return實現(xiàn)匯率轉換器教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Python全棧之隊列詳解

    Python全棧之隊列詳解

    這篇文章主要為大家介紹了Python全棧之隊列,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Python編程使用有限狀態(tài)機識別地址有效性

    Python編程使用有限狀態(tài)機識別地址有效性

    這篇文章主要介紹了Python編程中如何使用有限狀態(tài)機識別地址有效性,如何識別一個地址是否有效,確切的講,如何編程識別一個中國地址是否有效
    2021-09-09
  • Python 使用Opencv實現(xiàn)目標檢測與識別的示例代碼

    Python 使用Opencv實現(xiàn)目標檢測與識別的示例代碼

    這篇文章主要介紹了Python 使用Opencv實現(xiàn)目標檢測與識別的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Python爬蟲之Selenium實現(xiàn)關閉瀏覽器

    Python爬蟲之Selenium實現(xiàn)關閉瀏覽器

    這篇文章主要介紹了Python爬蟲之Selenium實現(xiàn)關閉瀏覽器,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • python中l(wèi)eastsq函數的使用方法

    python中l(wèi)eastsq函數的使用方法

    這篇文章主要介紹了python中l(wèi)eastsq函數的使用方法,leastsq作用是最小化一組方程的平方和,下面文章舉例說明詳細內容,具有一的參考價值,需要的小伙伴可以參考一下
    2022-03-03
  • Python中的urllib模塊使用詳解

    Python中的urllib模塊使用詳解

    這篇文章主要介紹了Python中的urllib模塊使用詳解,是Python入門學習中的基礎知識,需要的朋友可以參考下
    2015-07-07
  • python3 dict ndarray 存成json,并保留原數據精度的實例

    python3 dict ndarray 存成json,并保留原數據精度的實例

    今天小編就為大家分享一篇python3 dict ndarray 存成json,并保留原數據精度的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python3多進程 multiprocessing 模塊實例詳解

    Python3多進程 multiprocessing 模塊實例詳解

    這篇文章主要介紹了Python3多進程 multiprocessing 模塊,結合實例形式詳細分析了Python3多進程 multiprocessing 模塊的概念、原理、相關方法使用技巧與注意事項,需要的朋友可以參考下
    2018-06-06
  • python與mysql數據庫交互的實現(xiàn)

    python與mysql數據庫交互的實現(xiàn)

    這篇文章主要介紹了python與mysql數據庫交互的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01

最新評論