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

一文帶你深入理解Python的`functools.lru_cache`裝飾器

 更新時間:2023年07月02日 14:07:19   作者:小小張說故事  
Python中的functools.lru_cache裝飾器是一個非常有用的裝飾器,它可以幫助我們優(yōu)化遞歸函數(shù),避免重復(fù)計算已經(jīng)計算過的值,在這篇文章中,我們將探討?functools.lru_cache?的工作原理以及如何使用它,感興趣的朋友跟著小編一起來學(xué)習(xí)吧

一、什么是 functools.lru_cache?

functools.lru_cache 是 Python 標(biāo)準(zhǔn)庫中 functools 模塊的一部分。lru_cache 裝飾器可以用來為一個函數(shù)添加一個緩存系統(tǒng)。這個緩存系統(tǒng)會存儲函數(shù)的輸入和對應(yīng)的輸出。如果函數(shù)被調(diào)用,并且給出了已經(jīng)緩存過的輸入,那么函數(shù)就不會重新計算,而是直接從緩存中獲取對應(yīng)的輸出。

LRU 是 “Least Recently Used” 的縮寫,意思是 “最近最少使用”。LRU 緩存就是一種緩存淘汰算法,當(dāng)緩存達(dá)到預(yù)設(shè)的容量上限時,會優(yōu)先淘汰最近最少使用的數(shù)據(jù)。

from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
    if n < 2:
        return n
    return fib(n - 1) + fib(n - 2)
print(fib(10))  # 輸出:55

在上面的例子中,我們定義了一個求斐波那契數(shù)列的函數(shù),并且使用 @lru_cache(maxsize=None) 裝飾器對其進(jìn)行了裝飾。然后我們調(diào)用 fib(10),得到結(jié)果 55。實(shí)際上,由于使用了緩存,fib 函數(shù)在求解過程中,對于同樣的參數(shù)只進(jìn)行了一次計算。

二、如何使用 functools.lru_cache?

要使用 functools.lru_cache 裝飾器,你只需要在你的函數(shù)定義之前添加 @functools.lru_cache 行。這會讓 lru_cache 裝飾器知道你希望為這個函數(shù)添加一個緩存系統(tǒng)。

lru_cache 裝飾器有兩個可選參數(shù):

  • maxsize:這個參數(shù)用來設(shè)置緩存的大小。如果你設(shè)置了這個參數(shù),緩存的大小就會被限制在這個值之內(nèi)。如果你不設(shè)置這個參數(shù),或者將其設(shè)置為 None,那么緩存的大小就沒有上限。

  • typed:如果你將這個參數(shù)設(shè)置為 True,那么 lru_cache 就會根據(jù)輸入?yún)?shù)的類型分別進(jìn)行緩存。也就是說,11.0 盡管在 Python 中是相等的,但它們會被當(dāng)成兩個不同的輸入進(jìn)行緩存。默認(rèn)情況下,typed 參數(shù)是 False

from functools import lru_cache
@lru_cache(maxsize=128, typed=False)
def add(x, y):
    print(f"Calculating: {x} + {y}")
    return x + y
print(add(1, 2))  # 輸出:Calculating: 1 + 2 \n 3
print(add(1, 2))  # 輸出:3
print(add(1.0, 2.0))  # 輸出:Calculating: 1.0 + 2.0 \n 3.0
print(add(1.0, 2.0))  # 輸出:3.0

在上面的代碼中,我們定義了一個加法函數(shù) add,并使用 lru_cache 裝飾器對其進(jìn)行裝飾。我們可以看到,當(dāng)我們第二次調(diào)用 add(1, 2)add(1.0, 2.0) 時,add 函數(shù)并沒有重新進(jìn)行計算,而是直接從緩存中獲取了結(jié)果。

三、functools.lru_cache 的用途

functools.lru_cache 可以用于優(yōu)化那些具有重復(fù)計算的遞歸函數(shù),或者計算成本較高的函數(shù)。通過保存已經(jīng)計算過的值,functools.lru_cache 能夠避免重復(fù)的計算,從而提高程序的運(yùn)行效率。

例如,求解斐波那契數(shù)列就是一個典型的使用場景。在沒有優(yōu)化的情況下,求解斐波那契數(shù)列的時間復(fù)雜度是指數(shù)級別的。但是,如果我們使用 functools.lru_cache 對其進(jìn)行優(yōu)化,那么我們就可以將其時間復(fù)雜度降低到線性級別。

此外,functools.lru_cache 還可以用于緩存那些對數(shù)據(jù)庫或者文件系統(tǒng)的重復(fù)查詢,從而提高程序的性能。

需要注意的是,functools.lru_cache 并不適合所有的場景。因為 functools.lru_cache 是通過空間換取時間的方式來提高程序的性能的,所以,如果你的程序運(yùn)行在內(nèi)存有限的環(huán)境中,或者你的函數(shù)有大量的不同輸入,那么使用 functools.lru_cache 可能會導(dǎo)致內(nèi)存消耗過大。此外,如果你的函數(shù)有副作用,或者依賴于外部狀態(tài),那么 functools.lru_cache 也可能無法正確地工作。在這些情況下,你可能需要尋找其他的優(yōu)化策略。

總的來說,functools.lru_cache 是一個非常強(qiáng)大的工具,它能夠幫助我們優(yōu)化代碼,提高程序的性能。當(dāng)你在編寫一個計算密集型或者需要大量重復(fù)計算的函數(shù)時,不妨考慮使用 functools.lru_cache 對其進(jìn)行優(yōu)化。

四、深入理解 functools.lru_cache

當(dāng)我們將 functools.lru_cache 應(yīng)用到函數(shù)上時,每次調(diào)用函數(shù),它都會檢查其參數(shù)是否已經(jīng)在緩存中。如果在緩存中,它將返回緩存的結(jié)果,而不需要重新計算。如果沒有在緩存中,那么函數(shù)將被調(diào)用并且結(jié)果將被添加到緩存中。當(dāng)緩存滿了,最少使用的條目將被拋棄。

以下是一個理解 functools.lru_cache 工作方式的例子:

from functools import lru_cache
@lru_cache(maxsize=3)
def foo(n):
    print(f"Running foo({n})")
    return n
print(foo(1))  # 輸出:Running foo(1) \n 1
print(foo(2))  # 輸出:Running foo(2) \n 2
print(foo(3))  # 輸出:Running foo(3) \n 3
print(foo(1))  # 輸出:1
print(foo(2))  # 輸出:2
print(foo(3))  # 輸出:3
print(foo(4))  # 輸出:Running foo(4) \n 4
print(foo(1))  # 輸出:Running foo(1) \n 1

在這個例子中,我們設(shè)定 maxsize=3,也就是只緩存最近的三個結(jié)果。當(dāng)我們連續(xù)調(diào)用 foo(1),foo(2)foo(3) 時,這三個結(jié)果都被緩存了下來。再次調(diào)用這三個函數(shù)時,由于結(jié)果已經(jīng)在緩存中,函數(shù)并沒有被重新執(zhí)行。但是當(dāng)我們調(diào)用 foo(4) 時,由于緩存已滿,所以最早被緩存的 foo(1) 的結(jié)果被移除了。再次調(diào)用 foo(1) 時,函數(shù)需要被重新執(zhí)行。

這個例子說明了 functools.lru_cache 的 LRU 特性:當(dāng)緩存達(dá)到上限時,最近最少使用的緩存會被移除。

五、清理和查看緩存

functools.lru_cache 還提供了兩個方法用于清理和查看緩存:cache_clearcache_info。

cache_clear 方法可以清空所有的緩存。例如,在上面的 foo 函數(shù)中,我們可以通過 foo.cache_clear() 來清空所有的緩存。

cache_info 方法返回一個命名元組,描述了緩存的狀態(tài)。它包含以下幾個字段:hits、missesmaxsizecurrsize。其中,hitsmisses 分別表示緩存命中和未命中的次數(shù),maxsize 表示緩存的最大容量,currsize 表示當(dāng)前緩存的使用量。

from functools import lru_cache
@lru_cache(maxsize=3)
def foo(n):
    print(f"Running foo({n})")
    return n
foo(1)
foo(2)
foo(3)
foo(4)
print(foo.cache_info())  # 輸出:CacheInfo(hits=0, misses=4, maxsize=3, currsize=3)
foo(4)
print(foo.cache_info())  # 輸出:CacheInfo(hits=1, misses=4, maxsize=3, currsize=3)
foo.cache_clear()
print(foo.cache_info())  # 輸出:CacheInfo(hits=0, misses=0, maxsize=3, currsize=0)

在這個例子中,我們首先調(diào)用了 foo(1),foo(2)foo(3)foo(4)。此時,由于 foo(1) 的緩存已經(jīng)被淘汰,緩存中僅保留了 foo(2),foo(3)foo(4) 的結(jié)果。調(diào)用 foo.cache_info(),我們可以看到緩存未命中的次數(shù)為 4,當(dāng)前緩存的使用量為 3。

然后我們再次調(diào)用 foo(4),由于這個結(jié)果已經(jīng)在緩存中,所以這次是緩存命中,調(diào)用 foo.cache_info(),我們可以看到緩存命中的次數(shù)變成了 1。

最后,我們調(diào)用 foo.cache_clear() 清空了所有的緩存,再次調(diào)用 foo.cache_info(),我們可以看到當(dāng)前緩存的使用量變成了 0。

以上,我們介紹了 functools.lru_cache 裝飾器的使用方法和原理,包括如何使用 lru_cache 對函數(shù)進(jìn)行優(yōu)化,以及如何清理和查看緩存。希望這篇文章能夠幫助你更好地理解和使用 functools.lru_cache

到此這篇關(guān)于一文帶你深入理解Python的`functools.lru_cache`裝飾器的文章就介紹到這了,更多相關(guān)Python `functools.lru_cache`裝飾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python switch 實(shí)現(xiàn)多分支選擇功能

    python switch 實(shí)現(xiàn)多分支選擇功能

    這篇文章主要介紹了python switch 實(shí)現(xiàn)多分支選擇功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • django 發(fā)送郵件和緩存的實(shí)現(xiàn)代碼

    django 發(fā)送郵件和緩存的實(shí)現(xiàn)代碼

    這篇文章主要介紹了django 發(fā)送郵件和緩存的實(shí)現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • 使用python生成大量數(shù)據(jù)寫入es數(shù)據(jù)庫并查詢操作(2)

    使用python生成大量數(shù)據(jù)寫入es數(shù)據(jù)庫并查詢操作(2)

    這篇文章主要介紹了使用python生成大量數(shù)據(jù)寫入es數(shù)據(jù)庫并查詢操作,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • conda安裝GPU版pytorch默認(rèn)卻是cpu版本

    conda安裝GPU版pytorch默認(rèn)卻是cpu版本

    本文主要介紹了遇到Conda安裝PyTorch GPU版本卻默認(rèn)安裝CPU的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-06-06
  • Python-for循環(huán)的內(nèi)部機(jī)制

    Python-for循環(huán)的內(nèi)部機(jī)制

    這篇文章主要介紹了Python for循環(huán)的內(nèi)部機(jī)制,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Python中Scrapy爬蟲圖片處理詳解

    Python中Scrapy爬蟲圖片處理詳解

    這篇文章主要介紹了Python中Scrapy爬蟲圖片處理方式和原理,需要的朋友學(xué)習(xí)參考下吧。
    2017-11-11
  • python代碼中的縮進(jìn)規(guī)則詳細(xì)解釋(史上最全)

    python代碼中的縮進(jìn)規(guī)則詳細(xì)解釋(史上最全)

    這篇文章主要介紹了代碼縮進(jìn)的重要性以及在Python語言中的具體規(guī)則,代碼縮進(jìn)有助于提高代碼的可讀性和整潔性,并且是Python語言中一個強(qiáng)制性的語法要求,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-01-01
  • Python for循環(huán)你了解嗎

    Python for循環(huán)你了解嗎

    這篇文章主要為大家介紹了Python for循環(huán),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Python實(shí)現(xiàn)冒泡,插入,選擇排序簡單實(shí)例

    Python實(shí)現(xiàn)冒泡,插入,選擇排序簡單實(shí)例

    這篇文章主要介紹了Python實(shí)現(xiàn)冒泡,插入,選擇排序簡單實(shí)例,很適合Python初學(xué)者學(xué)習(xí)參考之用,需要的朋友可以參考下
    2014-08-08
  • Python Web項目部署Gunicorn使用詳解

    Python Web項目部署Gunicorn使用詳解

    Gunicorn是一個高效的Python WSGI HTTP服務(wù)器,專為生產(chǎn)環(huán)境設(shè)計,它采用pre-fork模型,通過主進(jìn)程管理多個工作進(jìn)程,提供穩(wěn)定性和并發(fā)處理能力,本文介紹Python Web項目部署Gunicorn使用詳解,感興趣的朋友跟隨小編一起看看吧
    2026-03-03

最新評論

鹤山市| 通海县| 临城县| 高淳县| 延津县| 乡城县| 房山区| 房产| 宁蒗| 宿松县| 阳春市| 建宁县| 靖边县| 津市市| 辽阳市| 遵义市| 炎陵县| 诏安县| 常宁市| 潜江市| 贵溪市| 南平市| 永顺县| 琼中| 墨玉县| 资源县| 共和县| 潍坊市| 漳浦县| 汝南县| 开原市| 桃园县| 晋城| 格尔木市| 灵宝市| 周口市| 泗洪县| 新源县| 瑞丽市| 修武县| 修武县|