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

python中functools.lru_cache的具體使用

 更新時(shí)間:2024年09月23日 09:28:32   作者:pumpkin84514  
本文主要介紹了python中functools.lru_cache的具體使用,通過functools.lru_cache,你可以輕松優(yōu)化具有重復(fù)計(jì)算的函數(shù),大大提高代碼的執(zhí)行效率

1. 優(yōu)化算法的思想

當(dāng)算法的復(fù)雜度較高時(shí),常見的優(yōu)化策略包括:

  • 減少重復(fù)計(jì)算:通過緩存結(jié)果避免相同輸入的重復(fù)計(jì)算。這種方法常用在遞歸和動(dòng)態(tài)規(guī)劃問題中。
  • 合理使用數(shù)據(jù)結(jié)構(gòu):根據(jù)具體問題,選擇合適的數(shù)據(jù)結(jié)構(gòu)(如哈希表、堆、樹等),以提高操作效率。例如,用哈希表可以加快查找操作。
  • 剪枝(Pruning):在搜索或遞歸算法中,及時(shí)放棄不可能產(chǎn)生最優(yōu)解的分支,減少無效計(jì)算。
  • 分治法(Divide and Conquer):將大問題拆解為多個(gè)小問題,分別求解后再合并結(jié)果。經(jīng)典例子是歸并排序。
  • 記憶化(Memoization):將已經(jīng)計(jì)算過的結(jié)果保存下來,以便下次直接使用。這種策略在遞歸或遞推中尤為重要。
  • 動(dòng)態(tài)規(guī)劃(Dynamic Programming):通過存儲(chǔ)子問題的結(jié)果,避免重復(fù)計(jì)算子問題。

2. LRU 算法與優(yōu)化思想的關(guān)系

LRU(Least Recently Used,最近最少使用) 是一種基于 緩存優(yōu)化 思想的算法,用于減少重復(fù)計(jì)算。這與上面的減少重復(fù)計(jì)算思想緊密相關(guān)。LRU 通過緩存結(jié)果來加速訪問,但同時(shí)通過淘汰最近最少使用的緩存項(xiàng)來保證緩存不會(huì)無限增長(zhǎng)。

LRU 算法的核心思想

  • 保留最近使用的結(jié)果,淘汰不常用的結(jié)果。
  • 如果緩存容量達(dá)到上限,優(yōu)先淘汰最久未被使用的項(xiàng)。

3. functools.lru_cache

Python 提供了 functools.lru_cache,這是一個(gè)基于 LRU 算法的緩存裝飾器。它會(huì)緩存函數(shù)的返回值,當(dāng)再次調(diào)用該函數(shù)時(shí),如果參數(shù)相同,直接從緩存中返回結(jié)果,避免重復(fù)計(jì)算。lru_cache 自動(dòng)處理 LRU 淘汰策略,能夠顯著優(yōu)化那些需要大量重復(fù)計(jì)算的場(chǎng)景。

lru_cache 的參數(shù)

  • maxsize:緩存的最大容量,超過這個(gè)容量時(shí),最近最少使用的數(shù)據(jù)會(huì)被淘汰。maxsize=None 表示沒有限制。
  • typed:若設(shè)置為 True,不同類型的相同值將被區(qū)別對(duì)待。例如 1 和 1.0 會(huì)被認(rèn)為是不同的參數(shù)。

4. 原理詳解:functools.lru_cache 是如何工作的?

  • 緩存機(jī)制:當(dāng)你第一次調(diào)用某個(gè)函數(shù)時(shí),它的計(jì)算結(jié)果會(huì)被緩存起來,儲(chǔ)存在一個(gè)類似字典的結(jié)構(gòu)中。
  • 緩存命中:當(dāng)你再次調(diào)用該函數(shù),且參數(shù)相同時(shí),函數(shù)不會(huì)再次執(zhí)行,而是直接返回緩存中的結(jié)果。
  • 緩存淘汰:如果緩存的數(shù)量達(dá)到了 maxsize,并且有新的函數(shù)調(diào)用進(jìn)入緩存,則最近最少被使用的緩存項(xiàng)會(huì)被淘汰。

5. 如何使用 functools.lru_cache 優(yōu)化算法

接下來通過一些例子說明如何結(jié)合 functools.lru_cache 和 LRU 算法來優(yōu)化算法。

示例 1:優(yōu)化遞歸算法(斐波那契數(shù)列)

未優(yōu)化的版本(時(shí)間復(fù)雜度為 O(2^n))

def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(30))  # 計(jì)算非常慢,因?yàn)榇嬖诖罅恐貜?fù)計(jì)算

優(yōu)化后的版本(使用 functools.lru_cache

from functools import lru_cache

@lru_cache(maxsize=128)
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(30))  # 速度快得多,因?yàn)楸苊饬酥貜?fù)計(jì)算

maxsize=128:表示最多緩存 128 個(gè)結(jié)果,超出部分將按 LRU 策略淘汰。

示例 2:帶不同參數(shù)類型的緩存

@lru_cache(maxsize=100, typed=True)
def double(x):
    return x * 2

print(double(1))   # 緩存 1 的結(jié)果
print(double(1.0)) # 緩存 1.0 的結(jié)果,區(qū)別對(duì)待

這里 typed=True 意味著 double(1) 和 double(1.0) 是不同的緩存條目,雖然它們的值相同,但類型不同。

示例 3:緩存大規(guī)模計(jì)算結(jié)果

假設(shè)我們有一個(gè)耗時(shí)的計(jì)算,比如對(duì)一個(gè)大數(shù)組的求和操作:

import time

@lru_cache(maxsize=32)
def expensive_sum(arr):
    time.sleep(2)  # 模擬耗時(shí)操作
    return sum(arr)

arr = tuple(range(1000000))

# 第一次調(diào)用
print(expensive_sum(arr))  # 需要等待 2 秒

# 第二次調(diào)用(相同的參數(shù))
print(expensive_sum(arr))  # 立即返回結(jié)果,無需等待

由于 arr 是相同的參數(shù),第二次調(diào)用時(shí)直接從緩存中獲取結(jié)果。

總結(jié)

  • 優(yōu)化思想:常見的優(yōu)化策略包括減少重復(fù)計(jì)算、合理使用數(shù)據(jù)結(jié)構(gòu)、動(dòng)態(tài)規(guī)劃等。
  • LRU 算法:是一種緩存淘汰算法,主要用于緩存系統(tǒng)中,通過淘汰最近最少使用的緩存項(xiàng),優(yōu)化重復(fù)計(jì)算問題。
  • functools.lru_cache:是 Python 提供的基于 LRU 算法的緩存工具,用于減少函數(shù)的重復(fù)計(jì)算,自動(dòng)管理緩存。
  • 應(yīng)用場(chǎng)景:可以用于遞歸、動(dòng)態(tài)規(guī)劃、I/O 緩存等需要重復(fù)調(diào)用的場(chǎng)景。

通過 functools.lru_cache,你可以輕松優(yōu)化具有重復(fù)計(jì)算的函數(shù),大大提高代碼的執(zhí)行效率。

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

相關(guān)文章

  • Python項(xiàng)目跨域問題解決方案

    Python項(xiàng)目跨域問題解決方案

    這篇文章主要介紹了Python項(xiàng)目跨域問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • python中reload(module)的用法示例詳解

    python中reload(module)的用法示例詳解

    與from和import相比,reload是內(nèi)置函數(shù),而不是語句,下面這篇文章主要給大家介紹了關(guān)于python中reload(module)用法的相關(guān)資料,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面來一起看看吧。
    2017-09-09
  • python基于tkinter制作圖形界面的2048游戲

    python基于tkinter制作圖形界面的2048游戲

    這篇文章主要介紹了python基于tkinter制作圖形界面的2048游戲的方法,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-04-04
  • 完美解決python3.7 pip升級(jí) 拒絕訪問問題

    完美解決python3.7 pip升級(jí) 拒絕訪問問題

    這篇文章主要介紹了python3.7 pip升級(jí) 拒絕訪問 解決方案,文中給大家提到了python中for循環(huán)問題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-07-07
  • python3+PyQt5實(shí)現(xiàn)自定義窗口部件Counters

    python3+PyQt5實(shí)現(xiàn)自定義窗口部件Counters

    這篇文章主要為大家詳細(xì)介紹了python3+PyQt5實(shí)現(xiàn)自定義窗口部件,Counters自定窗口部件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Python自動(dòng)化操控鼠標(biāo)的零基礎(chǔ)完全指南

    Python自動(dòng)化操控鼠標(biāo)的零基礎(chǔ)完全指南

    在日常的電腦使用中,我們經(jīng)常會(huì)遇到大量重復(fù)性的鼠標(biāo)操作,通過使用?Python?腳本,你可以讓電腦自動(dòng)、精準(zhǔn)地移動(dòng)鼠標(biāo)、執(zhí)行點(diǎn)擊甚至滾動(dòng)頁面,本篇指南將帶你從零開始,系統(tǒng)地學(xué)習(xí)如何使用?Python?操控你的鼠標(biāo),開啟桌面自動(dòng)化的第一步
    2026-04-04
  • 解決pycharm 工具欄Tool中找不到Run manager.py Task的問題

    解決pycharm 工具欄Tool中找不到Run manager.py Task的問題

    今天小編就為大家分享一篇解決pycharm 工具欄Tool中找不到Run manager.py Task的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python中的幾種矩陣乘法(小結(jié))

    Python中的幾種矩陣乘法(小結(jié))

    這篇文章主要介紹了Python中的幾種矩陣乘法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 使用Python中的Argparse實(shí)現(xiàn)將列表作為命令行參數(shù)傳遞

    使用Python中的Argparse實(shí)現(xiàn)將列表作為命令行參數(shù)傳遞

    Argparse?是一個(gè)?Python?庫(kù),用于以用戶友好的方式解析命令行參數(shù),本文我們將討論如何使用?Python?中的?Argparse?庫(kù)將列表作為命令行參數(shù)傳遞,感興趣的可以了解下
    2023-08-08
  • Python中使用gzip模塊壓縮文件的簡(jiǎn)單教程

    Python中使用gzip模塊壓縮文件的簡(jiǎn)單教程

    這篇文章主要介紹了Python中使用gzip模塊壓縮文件的簡(jiǎn)單教程,本文的例子主要針對(duì)類UNIXZ系統(tǒng),需要的朋友可以參考下
    2015-04-04

最新評(píng)論

长葛市| 个旧市| 五河县| 额济纳旗| 全椒县| 耒阳市| 德阳市| 都匀市| 宿迁市| 磴口县| 九台市| 博客| 乳源| 乌拉特前旗| 静宁县| 疏附县| 安图县| 玛纳斯县| 阳高县| 临高县| 永康市| 神池县| 枝江市| 临夏县| 阳东县| 泽普县| 曲阳县| 锡林浩特市| 田阳县| 南郑县| 阜城县| 山西省| 文化| 忻州市| 泰州市| 卢湾区| 罗江县| 扶沟县| 南澳县| 平和县| 唐海县|