欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python中functools.lru_cache的具體使用

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

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

當算法的復雜度較高時,常見的優(yōu)化策略包括:

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

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

LRU(Least Recently Used,最近最少使用) 是一種基于 緩存優(yōu)化 思想的算法,用于減少重復計算。這與上面的減少重復計算思想緊密相關。LRU 通過緩存結果來加速訪問,但同時通過淘汰最近最少使用的緩存項來保證緩存不會無限增長。

LRU 算法的核心思想

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

3. functools.lru_cache

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

lru_cache 的參數(shù)

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

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

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

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

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

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

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

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

print(fibonacci(30))  # 計算非常慢,因為存在大量重復計算

優(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))  # 速度快得多,因為避免了重復計算

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

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

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

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

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

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

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

import time

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

arr = tuple(range(1000000))

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

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

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

總結

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

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

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

相關文章

  • Python爬蟲抓取論壇關鍵字過程解析

    Python爬蟲抓取論壇關鍵字過程解析

    這篇文章主要介紹了Python爬蟲抓取論壇關鍵字過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • Pytest測試報告工具Allure的高級用法

    Pytest測試報告工具Allure的高級用法

    這篇文章介紹了Pytest測試報告工具Allure的高級用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Python調(diào)用Java可執(zhí)行jar包問題

    Python調(diào)用Java可執(zhí)行jar包問題

    這篇文章主要介紹了Python調(diào)用Java可執(zhí)行jar包問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Python collections.deque雙邊隊列原理詳解

    Python collections.deque雙邊隊列原理詳解

    這篇文章主要介紹了Python collections.deque雙邊隊列原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • Python中的bytes類型用法及實例分享

    Python中的bytes類型用法及實例分享

    這篇文章主要介紹了Python中的bytes類型及其用法,Python?bytes?類型用來表示一個字節(jié)串,bytes?只負責以字節(jié)序列的形式來存儲數(shù)據(jù),下面對其的相關內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-03-03
  • 連接Python程序與MySQL的教程

    連接Python程序與MySQL的教程

    這篇文章主要介紹了連接Python程序與MySQL的教程,MySQL作為最具人氣的數(shù)據(jù)庫,與程序之間的連接也成為了如今Python學習中近乎必備的知識,需要的朋友可以參考下
    2015-04-04
  • Python實現(xiàn)將wav轉(zhuǎn)amr,并轉(zhuǎn)換成hex數(shù)組

    Python實現(xiàn)將wav轉(zhuǎn)amr,并轉(zhuǎn)換成hex數(shù)組

    這篇文章主要介紹了Python實現(xiàn)將wav轉(zhuǎn)amr,并轉(zhuǎn)換成hex數(shù)組方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 用Python制作一個文件加密器

    用Python制作一個文件加密器

    大家好,本篇文章主要講的是用Python制作一個文件加密器,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • 在python中做正態(tài)性檢驗示例

    在python中做正態(tài)性檢驗示例

    今天小編就為大家分享一篇在python中做正態(tài)性檢驗示例,具有很的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 修復Python?Pandas數(shù)據(jù)標記錯誤的幾種方法總結

    修復Python?Pandas數(shù)據(jù)標記錯誤的幾種方法總結

    用于分析數(shù)據(jù)的?Python?庫稱為?Pandas,在?Pandas?中讀取數(shù)據(jù)最常見的方式是通過?CSV?文件,但?CSV?文件的限制是它應該采用特定的格式,否則在標記數(shù)據(jù)時會拋出錯誤,在本文中,我們將討論修復?Python?Pandas?錯誤標記數(shù)據(jù)的各種方法
    2023-10-10

最新評論