最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、前言

我們經(jīng)常談?wù)摰木彺嬉辉~,更多的類似于將硬盤中的數(shù)據(jù)存放到內(nèi)存中以至于提高讀取速度,比如常說(shuō)的redis,就經(jīng)常用來(lái)做數(shù)據(jù)的緩存。
Python的緩存(lru_cache)是一種裝飾在被執(zhí)行的函數(shù)上,將其執(zhí)行的結(jié)果緩存起來(lái),當(dāng)下次請(qǐng)求的時(shí)候,如果請(qǐng)求該函數(shù)的傳參未變則直接返回緩存起來(lái)的結(jié)果而不再執(zhí)行函數(shù)的一種緩存裝飾器。

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

二、舉例說(shuō)明

1.現(xiàn)在我們先不使用緩存來(lái)寫(xiě)一個(gè)求兩數(shù)之和的函數(shù),并調(diào)用執(zhí)行它兩次:

def test(a, b):
    print('開(kāi)始計(jì)算a+b的值...')
    return a + b


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

執(zhí)行結(jié)果

開(kāi)始計(jì)算a+b的值...
1+2等于: 3
開(kāi)始計(jì)算a+b的值...
1+2等于: 3

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

from functools import lru_cache

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

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

執(zhí)行結(jié)果

開(kāi)始計(jì)算a+b的值...
1+2等于: 3
1+2等于: 3

可以看到test函數(shù)只被執(zhí)行了一次,第二次的調(diào)用直接輸出了結(jié)果,使用了緩存起來(lái)的值。

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

不使用緩存求第40項(xiàng)的斐波拉契數(shù)列

import datetime

def fibonacci(num):
	# 不使用緩存時(shí),會(huì)重復(fù)執(zhí)行函數(shù)
    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í)行時(shí)間', end - start)

執(zhí)行時(shí)間

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

使用緩存求第40項(xiàng)的斐波拉契數(shù)列:

import datetime

def fibonacci(num):
	# 不使用緩存時(shí),會(huì)重復(fù)執(zhí)行函數(shù)
    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í)行時(shí)間', end - start)

執(zhí)行時(shí)間

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

兩個(gè)差距是非常明顯的,因?yàn)椴皇褂镁彺鏁r(shí),相當(dāng)于要重復(fù)執(zhí)行了很多的函數(shù),而使用了lru_cache則把之前執(zhí)行的函數(shù)結(jié)果已經(jīng)緩存了起來(lái),就不需要再次執(zhí)行了。

三、lru_cache 用法

1.參數(shù)詳解

查看lru_cache源碼會(huì)發(fā)現(xiàn)它可以傳遞兩個(gè)參數(shù):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裝飾的方法最大可緩存的結(jié)果數(shù)量 (被裝飾方法傳參不同一樣,則結(jié)果不一樣;如果傳參一樣則為同一個(gè)結(jié)果), 如果不指定傳參則默認(rèn)值為128,表示最多緩存128個(gè)返回結(jié)果,當(dāng)達(dá)到了128個(gè)時(shí),有新的結(jié)果要保存時(shí),則會(huì)刪除最舊的那個(gè)結(jié)果。如果maxsize傳入為None則表示可以緩存無(wú)限個(gè)結(jié)果;

2)typed

默認(rèn)為false,代表不區(qū)分?jǐn)?shù)據(jù)類型,如果設(shè)置為True,則會(huì)區(qū)分傳參類型進(jìn)行緩存,官方是這樣描述的:

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

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

from functools import lru_cache

@lru_cache
def test(a):
    print('函數(shù)被調(diào)用了...')
    return a

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

執(zhí)行結(jié)果

函數(shù)被調(diào)用了...
1.0
函數(shù)被調(diào)用了...

但如果是多參數(shù)的情況下,則會(huì)被當(dāng)成一個(gè)結(jié)果:

from functools import lru_cache

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

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

執(zhí)行結(jié)果

函數(shù)被調(diào)用了...
(1.0, 2.0)
(1.0, 2.0)

這個(gè)時(shí)候設(shè)置typed為true時(shí),則會(huì)區(qū)別緩存:

from functools import lru_cache

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

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

執(zhí)行結(jié)果

函數(shù)被調(diào)用了...
(1.0, 2.0)
函數(shù)被調(diào)用了...
(1, 2)

當(dāng)傳參個(gè)數(shù)大于1時(shí),才符合官方的說(shuō)法,不清楚是不是官方舉例有誤

2. lru_cache不支持可變參數(shù)

當(dāng)傳遞的參數(shù)是dict、list等的可變參數(shù)時(shí),lru_cache是不支持的,會(huì)報(bào)錯(cuò):

from functools import lru_cache

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

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

報(bào)錯(cuò)結(jié)果

TypeError: unhashable type: 'dict'

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

緩存緩存位置是否支持可變參數(shù)是否支持分布式是否支持過(guò)期時(shí)間設(shè)置支持的數(shù)據(jù)結(jié)構(gòu)需單獨(dú)安裝
redis緩存在redis管理的內(nèi)存中支持5種數(shù)據(jù)結(jié)構(gòu)
lru_cache緩存在應(yīng)用進(jìn)程的內(nèi)存中,應(yīng)用被關(guān)閉則被清空字典(參數(shù)為:key,結(jié)果為:value)

五、總結(jié)

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

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

相關(guān)文章

  • python中bisect模塊用法實(shí)例

    python中bisect模塊用法實(shí)例

    這篇文章主要介紹了python中bisect模塊用法實(shí)例,以實(shí)例形式介紹了bisect模塊中幾種常見(jiàn)函數(shù)的用法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-09-09
  • python logging 重復(fù)寫(xiě)日志問(wèn)題解決辦法詳解

    python logging 重復(fù)寫(xiě)日志問(wèn)題解決辦法詳解

    這篇文章主要介紹了python logging 重復(fù)寫(xiě)日志問(wèn)題解決辦法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Python Socket編程實(shí)現(xiàn)猜數(shù)字游戲交互體驗(yàn)

    Python Socket編程實(shí)現(xiàn)猜數(shù)字游戲交互體驗(yàn)

    當(dāng)利用Python的Socket編程創(chuàng)建一個(gè)猜數(shù)字游戲時(shí),需要分別實(shí)現(xiàn)服務(wù)器端和客戶端的邏輯,本文將詳細(xì)描述這兩個(gè)部分的功能和代碼片段
    2024-01-01
  • django數(shù)據(jù)庫(kù)報(bào)錯(cuò)解決匯總:django.db.utils.OperationalError?1045,1049,2003

    django數(shù)據(jù)庫(kù)報(bào)錯(cuò)解決匯總:django.db.utils.OperationalError?1045,1049,

    這篇文章主要給大家介紹了關(guān)于django數(shù)據(jù)庫(kù)報(bào)錯(cuò)解決:django.db.utils.OperationalError?1045,1049,2003的相關(guān)資料,文中將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • django多個(gè)APP的urls設(shè)置方法(views重復(fù)問(wèn)題解決)

    django多個(gè)APP的urls設(shè)置方法(views重復(fù)問(wèn)題解決)

    今天小編就為大家分享一篇django多個(gè)APP的urls設(shè)置方法(views重復(fù)問(wèn)題解決),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • Python基于pygame實(shí)現(xiàn)單機(jī)版五子棋對(duì)戰(zhàn)

    Python基于pygame實(shí)現(xiàn)單機(jī)版五子棋對(duì)戰(zhàn)

    這篇文章主要為大家詳細(xì)介紹了Python基于pygame實(shí)現(xiàn)單機(jī)版五子棋對(duì)戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • PyCharm連接遠(yuǎn)程服務(wù)器的超級(jí)詳細(xì)教程

    PyCharm連接遠(yuǎn)程服務(wù)器的超級(jí)詳細(xì)教程

    Pycharm可以與服務(wù)器建立連接,把相應(yīng)的項(xiàng)目同步到服務(wù)器上,下面這篇文章主要給大家介紹了關(guān)于PyCharm連接遠(yuǎn)程服務(wù)器的超級(jí)詳細(xì)教程,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Anaconda如何查看自己目前安裝的包詳解

    Anaconda如何查看自己目前安裝的包詳解

    Anaconda是一種用于數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)的開(kāi)源發(fā)行版,它包含了很多常用的Python包和工具,如NumPy、Pandas、Scipy、Scikit-Learn等,下面這篇文章主要給大家介紹了關(guān)于Anaconda如何查看自己目前安裝的包的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • 11個(gè)并不被常用但對(duì)開(kāi)發(fā)非常有幫助的Python庫(kù)

    11個(gè)并不被常用但對(duì)開(kāi)發(fā)非常有幫助的Python庫(kù)

    這篇文章主要介紹了11個(gè)并不被常用但對(duì)開(kāi)發(fā)非常有幫助的Python庫(kù),這些庫(kù)大都被放在Github上開(kāi)源、并且經(jīng)過(guò)一段時(shí)間的編寫(xiě)和維護(hù),對(duì)Python開(kāi)發(fā)有一定的幫助,需要的朋友可以參考下
    2015-03-03
  • 跟老齊學(xué)Python之有容乃大的list(3)

    跟老齊學(xué)Python之有容乃大的list(3)

    現(xiàn)在是講lis的第三章了。俗話說(shuō),事不過(guò)三,不知道在開(kāi)頭,我也不知道這一講是不是能夠把基礎(chǔ)的list知識(shí)講完呢。哈哈。其實(shí)如果真正寫(xiě)文章,會(huì)在寫(xiě)完之后把這句話刪掉的。而我則是完全像跟看官聊天一樣,就不刪除了。
    2014-09-09

最新評(píng)論

始兴县| 平乐县| 安图县| 比如县| 丰台区| 万山特区| 临澧县| 南宫市| 凌海市| 莆田市| 中阳县| 兴义市| 青铜峡市| 临沂市| 柳州市| 大厂| 阳新县| 兰坪| 泗水县| 兴山县| 四子王旗| 天门市| 萝北县| 勃利县| 肃宁县| 航空| 连山| 通渭县| 义乌市| 乌苏市| 普定县| 北流市| 锡林郭勒盟| 广丰县| 五大连池市| 莎车县| 观塘区| 石柱| 奈曼旗| 乌兰浩特市| 孟连|