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

Python之@cache裝飾器的使用及說(shuō)明

 更新時(shí)間:2025年12月22日 15:35:16   作者:Tipriest_  
@cache是Python3.9引入的新裝飾器,用于緩存函數(shù)結(jié)果,避免重復(fù)計(jì)算,提高性能,它基于functools.lru_cache實(shí)現(xiàn),支持無(wú)限大小緩存,適用于純函數(shù),使用示例包括遞歸斐波那契數(shù)列和模擬耗時(shí)計(jì)算,注意適用場(chǎng)景、參數(shù)限制和內(nèi)存占用,與@lru_cache相比,@cache更簡(jiǎn)潔,但功能單一

一、@cache裝飾器的基本概念

@cache 是 Python 3.9 引入的新功能,來(lái)源于標(biāo)準(zhǔn)庫(kù) functools 模塊。它的作用是 對(duì)函數(shù)結(jié)果進(jìn)行緩存(記憶化 memoization),從而避免重復(fù)計(jì)算,提高程序性能。

它的定義方式非常簡(jiǎn)單:

from functools import cache

@cache
def some_function(...):
    ...

當(dāng)你用 @cache 修飾一個(gè)函數(shù)時(shí),Python 會(huì)將該函數(shù)的輸入?yún)?shù)與計(jì)算結(jié)果自動(dòng)保存到一個(gè)緩存(字典)中。當(dāng)后續(xù)調(diào)用該函數(shù)且參數(shù)完全相同時(shí),不會(huì)再次執(zhí)行函數(shù)體的計(jì)算邏輯,而是直接返回之前緩存的結(jié)果。

二、工作原理

@cache 裝飾器內(nèi)部其實(shí)是基于 functools.lru_cache 實(shí)現(xiàn)的,它等價(jià)于:

from functools import lru_cache

cache = lru_cache(maxsize=None)

也就是說(shuō):

  • 無(wú)限大小緩存maxsize=None 表示緩存結(jié)果沒(méi)有數(shù)量限制,會(huì)根據(jù)需要一直增長(zhǎng)(直到你的內(nèi)存允許)。
  • 鍵值匹配:緩存根據(jù)參數(shù) 判斷是否命中(必須是可哈希類型,如數(shù)字、字符串、元組等)。
  • 返回緩存結(jié)果:命中緩存時(shí),直接返回結(jié)果而不執(zhí)行函數(shù)計(jì)算。

三、使用示例

1. 基本示例:遞歸斐波那契數(shù)列

from functools import cache

@cache
def fib(n):
    print(f"計(jì)算 fib({n})")
    if n < 2:
        return n
    return fib(n - 1) + fib(n - 2)

print(fib(10))  # 第一次需要計(jì)算
print(fib(10))  # 第二次直接命中緩存,不會(huì)重新計(jì)算

運(yùn)行效果:

  • 第一次調(diào)用會(huì)完整計(jì)算 fib(10),輸出多行 "計(jì)算 fib(n)" 的提示信息。
  • 第二次調(diào)用相同參數(shù),直接返回緩存值,不輸出任何計(jì)算日志。

2. 模擬耗時(shí)計(jì)算

import time
from functools import cache

@cache
def slow_function(x):
    print(f"開始計(jì)算 {x}...")
    time.sleep(2)  # 模擬耗時(shí)
    return x * x

# 首次調(diào)用耗時(shí)
print(slow_function(5))

# 第二次調(diào)用相同參數(shù)時(shí)幾乎立即返回
print(slow_function(5))

在實(shí)際場(chǎng)景中,如果一個(gè)函數(shù)計(jì)算代價(jià)高(如數(shù)據(jù)庫(kù)查詢、大文件解析、復(fù)雜計(jì)算等),使用 @cache 能顯著減少重復(fù)工作。

四、注意事項(xiàng)

適用場(chǎng)景

  • 適合純函數(shù)(函數(shù)結(jié)果只依賴輸入?yún)?shù),且不會(huì)產(chǎn)生副作用)。
  • 不適合需要每次實(shí)時(shí)更新的函數(shù)(例如獲取當(dāng)前時(shí)間、外部數(shù)據(jù)接口)。

參數(shù)限制

  • 參數(shù)必須可哈希(hashable),如整數(shù)、字符串、元組等。
  • 如果傳入不可哈希類型(如列表、字典),會(huì)報(bào)錯(cuò) TypeError: unhashable type

內(nèi)存占用

  • @cache 默認(rèn)緩存無(wú)限大小,可能造成內(nèi)存占用增加;如果希望限制緩存大小,應(yīng)使用 lru_cache(maxsize=...) 來(lái)控制。

緩存失效

  • @cache 沒(méi)有內(nèi)置超時(shí)或自動(dòng)失效機(jī)制,緩存會(huì)一直保留直到程序結(jié)束或手動(dòng)清除:
your_function.cache_clear()

五、@cache與@lru_cache的區(qū)別

特性@cache@lru_cache
緩存大小限制無(wú)限 (maxsize=None)可自定義 maxsize
緩存策略簡(jiǎn)單字典保存LRU(Least Recently Used)淘汰
用途適合始終命中緩存且參數(shù)種類有限適合緩存有限結(jié)果并自動(dòng)淘汰舊數(shù)據(jù)

六、總結(jié)

  • @cache 能讓函數(shù)的重復(fù)調(diào)用變得快速,尤其適合計(jì)算昂貴且參數(shù)唯一性高的場(chǎng)景。
  • 它是 @lru_cache(maxsize=None) 的簡(jiǎn)化版,功能單一但使用更簡(jiǎn)潔。
  • 使用時(shí)需注意內(nèi)存占用和參數(shù)類型,確保函數(shù)是“純”的(無(wú)副作用)。
  • 對(duì)于需要緩存大小控制的場(chǎng)景或更復(fù)雜的緩存管理,應(yīng)使用 lru_cache。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • tensorflow轉(zhuǎn)onnx的實(shí)現(xiàn)方法

    tensorflow轉(zhuǎn)onnx的實(shí)現(xiàn)方法

    本文主要介紹了tensorflow轉(zhuǎn)onnx的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Python Tkinter之事件處理詳解

    Python Tkinter之事件處理詳解

    事件處理,是 GUI 程序中不可或缺的重要組成部分,相比來(lái)說(shuō),控件只是組成一臺(tái)機(jī)器的零部件。本文我們將對(duì) Tkinter 中的事件處理機(jī)制做詳細(xì)的介紹,需要的可以參考一下
    2022-01-01
  • Python虛擬環(huán)境創(chuàng)建和使用方法(使用自帶的venv模塊)

    Python虛擬環(huán)境創(chuàng)建和使用方法(使用自帶的venv模塊)

    這篇文章主要如何在Python中使用虛擬環(huán)境,包括創(chuàng)建、激活、使用、生成requirements.txt文件、卸載包和刪除虛擬環(huán)境,虛擬環(huán)境有助于隔離項(xiàng)目依賴,避免版本沖突,并便于部署,需要的朋友可以參考下
    2024-12-12
  • python語(yǔ)句中end=‘ ‘的作用及說(shuō)明

    python語(yǔ)句中end=‘ ‘的作用及說(shuō)明

    這篇文章主要介紹了python語(yǔ)句中end=‘ ‘的作用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Python中的類的定義和對(duì)象的創(chuàng)建方法

    Python中的類的定義和對(duì)象的創(chuàng)建方法

    object?是?Python?為所有對(duì)象提供的?基類,提供有一些內(nèi)置的屬性和方法,可以使用?dir?函數(shù)查看,這篇文章主要介紹了Python中的類的定義和對(duì)象的創(chuàng)建,需要的朋友可以參考下
    2022-11-11
  • Flask-Docs自動(dòng)生成Api文檔安裝使用教程

    Flask-Docs自動(dòng)生成Api文檔安裝使用教程

    這篇文章主要為大家介紹了Flask-Docs自動(dòng)生成Api文檔安裝使用教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Python flask框架請(qǐng)求體數(shù)據(jù)、文件上傳、請(qǐng)求頭信息獲取方式詳解

    Python flask框架請(qǐng)求體數(shù)據(jù)、文件上傳、請(qǐng)求頭信息獲取方式詳解

    這篇文章主要介紹了Python flask框架請(qǐng)求體數(shù)據(jù)、文件上傳、請(qǐng)求頭信息獲取方式詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-03-03
  • pandas.DataFrame的pivot()和unstack()實(shí)現(xiàn)行轉(zhuǎn)列

    pandas.DataFrame的pivot()和unstack()實(shí)現(xiàn)行轉(zhuǎn)列

    這篇文章主要介紹了pandas.DataFrame的pivot()和unstack()實(shí)現(xiàn)行轉(zhuǎn)列,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • pytest基本用法簡(jiǎn)介

    pytest基本用法簡(jiǎn)介

    這篇文章主要介紹了pytest基本用法簡(jiǎn)介,幫助大家更好的利用python進(jìn)行自動(dòng)化測(cè)試,感興趣的朋友可以了解下
    2021-03-03
  • python實(shí)現(xiàn)掃雷小游戲

    python實(shí)現(xiàn)掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04

最新評(píng)論

兴义市| 汽车| 清丰县| 蒙阴县| 鄂尔多斯市| 高台县| 临洮县| 通化县| 连南| 荆门市| 博湖县| 贵南县| 北宁市| 南乐县| 和林格尔县| 西林县| 建水县| 井研县| 嘉黎县| 江北区| 琼中| 焦作市| 安岳县| 永定县| 新乡县| 信丰县| 天柱县| 汨罗市| 大庆市| 阿瓦提县| 旺苍县| 荔浦县| 龙岩市| 泾阳县| 绵竹市| 富阳市| 宜昌市| 鸡西市| 甘泉县| 常熟市| 饶平县|