国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python高級用法:裝飾器用于緩存

這篇具有很好參考價值的文章主要介紹了Python高級用法:裝飾器用于緩存。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

緩存裝飾器

緩存裝飾器與參數(shù)檢查十分相似,不過它重點是關(guān)注那些內(nèi)部狀態(tài)不會影響輸出的函數(shù)。每組參數(shù)都可以鏈接到唯一的結(jié)果。這種編程風(fēng)格是函數(shù)式編程的特點,當(dāng)輸入值有限時可以使用。

因此,緩存裝飾器可以將輸出與計算它所需要的參數(shù)放在一起,并在后續(xù)的調(diào)用中直接返回它。這種行為被稱為memoizing。

例子

我們下面創(chuàng)建一個使用裝飾器緩存技術(shù),實現(xiàn)記錄在一定時間內(nèi)函數(shù)是否被調(diào)用的例子,來解釋裝飾器用于緩存的用法。

準(zhǔn)備工作

首先我們準(zhǔn)備引入相關(guān)的包,time用于獲取當(dāng)前時間,hashlib用于轉(zhuǎn)換成哈希值,pickle用于將多個參數(shù)打包成一個對象,cache變量代表的是對函數(shù)返回值和時間的緩存。

import time
import hashlib
import pickle

cache = {}

依賴函數(shù)

def is_obsolete(entry, duration):
    return time.time() - entry['time'] > duration


def compute_key(function, args, kw):
    key = pickle.dumps((function.__name__, args, kw))
    return hashlib.sha1(key).hexdigest()

is_obsolete函數(shù)是用來比較上次函數(shù)訪問時間(entry[‘time’],entry是一個字典,entry[‘time’]存儲的就是上次訪問的時間)與當(dāng)前時間(time.time())的間隔是否大于指定間隔(duration)的函數(shù)。

compute_key函數(shù)將傳入的function,args,kw打包并轉(zhuǎn)換成二進(jìn)制形式,作為函數(shù)與參數(shù)對應(yīng)的唯一標(biāo)識。

構(gòu)建修飾器

def memoize(duration=10):
    def _memoize(function):
        def __memoize(*args, **kw):
            key = compute_key(function, args, kw)
            # 是否已經(jīng)擁有它了?
            if (key in cache and
                    not is_obsolete(cache[key], duration)):
                print('we got a winner')
                return cache[key]['value']
            # 計算
            result = function(*args, **kw)
            # 保存結(jié)果
            cache[key] = {
                'value': result,
                'time': time.time()
            }
            return result
        return __memoize
    return _memoize

在__memoize函數(shù)中,先使用compute_key函數(shù)獲取十六進(jìn)制的哈希值,作為唯一關(guān)鍵詞。然后查詢是否存在于緩存中(cache)并且時間是否滿足條件,如果均滿足則直接返回上次的運(yùn)行結(jié)果。否則重新計算結(jié)果并將結(jié)果存入緩存(cache)后返回。

測試

我們首先創(chuàng)建一個實現(xiàn)加法運(yùn)算的函數(shù)

@memoize()
def add(a, b):
    # 如果在執(zhí)行這個計算時計算機(jī)過熱
    # 請考慮中止程序
    return a + b

如果我們用以下代碼測試

print(add(1, 2))
print(add(1, 2))
print(add(2, 2))

得到的運(yùn)行結(jié)果如下:

3
we got a winner
3
4

第二次調(diào)用add(1, 2)時因為前面已經(jīng)調(diào)用過了,所以就直接給出提示返回結(jié)果,而add(2, 2)是一個新的參數(shù)的運(yùn)算,所以進(jìn)行了再次重復(fù)的運(yùn)算。

下面我們來看一下如果超時會有怎樣的結(jié)果,由于默認(rèn)的menoize參數(shù)是10,所以我們這里改成1

@memoize(1) # 1秒后令緩存失效
def add(a, b):
    return a + b
    
print(add(2, 3))
time.sleep(2)
print(add(2, 3))

我們使用time.sleep沉睡兩秒
運(yùn)行結(jié)果是文章來源地址http://www.zghlxwxcb.cn/news/detail-822693.html

5
5

到了這里,關(guān)于Python高級用法:裝飾器用于緩存的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 如何使用Python內(nèi)置緩存裝飾器: @lru_cache,@cache 與 @cached_property

    使用緩存是優(yōu)化Python程序速度的重要方法之一 。如果使用得當(dāng),可以大幅減少計算資源的負(fù)載,有效加快代碼運(yùn)行速度 Python 的內(nèi)置庫 functools 模塊附帶了 @lru_cache,@cache, @cached_property 裝飾器,使用非常簡便,不需要安裝第3方庫,不需要 redis 等數(shù)據(jù)庫保存對象等,通常只需要

    2024年02月11日
    瀏覽(25)
  • python測試開發(fā)面試??碱}:裝飾器

    Python 裝飾器是一個可調(diào)用的(函數(shù)、方法或類),它獲得一個函數(shù)對象 func_in 作為輸入,并返回另一函數(shù)對象 func_out。它用于擴(kuò)展函數(shù)、方法或類的行為。 裝飾器模式通常用于擴(kuò)展對象的功能。在日常生活中,這種擴(kuò)展的例子有:在槍上加一個消音器,使用不同的相機(jī)鏡頭等等

    2024年02月10日
    瀏覽(536)
  • Python高級用法:使用unittest進(jìn)行單元測試

    Python中含有一個單元測試模塊unittest,我們可以使用其中的工具來測試代碼。在編寫測試用例后,可以查看一系列輸入是否得到了預(yù)期的輸出。單元測試專注于測試軟件單元,軟件單元可以被理解為應(yīng)用程序代碼的最小可測試部分。 在代碼中我們需要測試的是一個數(shù)字是否為

    2024年01月19日
    瀏覽(23)
  • 利用Python進(jìn)行數(shù)據(jù)清洗與預(yù)處理:Pandas的高級用法【第147篇—Pandas的高級用法】

    利用Python進(jìn)行數(shù)據(jù)清洗與預(yù)處理:Pandas的高級用法【第147篇—Pandas的高級用法】

    前些天發(fā)現(xiàn)了一個巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家?!军c擊進(jìn)入巨牛的人工智能學(xué)習(xí)網(wǎng)站】。 在數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)領(lǐng)域,數(shù)據(jù)清洗和預(yù)處理是至關(guān)重要的步驟。Pandas庫作為Python中最受歡迎的數(shù)據(jù)處理工具之一,提供了強(qiáng)大的功能來處

    2024年04月09日
    瀏覽(37)
  • Python多線程編程全解析:基礎(chǔ)到高級用法

    Python多線程編程全解析:基礎(chǔ)到高級用法

    ? Python中有多線程的支持。Python的 threading 模塊提供了多線程編程的基本工具。在下面,我將列舉一些基礎(chǔ)的多線程用法和一些高級用法,并提供相應(yīng)的源代碼,其中包含中文注釋。 這些例子涵蓋了一些基礎(chǔ)和高級的多線程用法。請注意,在Python中由于全局解釋器鎖(GIL)的

    2024年02月03日
    瀏覽(18)
  • springboot 高級教程 jetcache 二級緩存用法

    多級緩存實際上是在二級緩存的基礎(chǔ)上,為了更好地提高系統(tǒng)的性能和可靠性,更適用于大型分布式系統(tǒng)的應(yīng)用場景。 使用多級緩存的原因包括: 數(shù)據(jù)緩存分層:不同級別的緩存可以被用來緩存不同類型、不同頻率訪問的數(shù)據(jù)。在這種情況下,系統(tǒng)會先在本地緩存中尋找數(shù)

    2024年02月08日
    瀏覽(26)
  • Python控制流程盤點及高級用法、神秘技巧大揭秘!

    Python控制流程盤點及高級用法、神秘技巧大揭秘!

    在這篇文章中我們將全面深入地介紹 Python 的控制流程,包括條件語句、循環(huán)結(jié)構(gòu)和異常處理等關(guān)鍵部分,尤其會將列表解析、生成器、裝飾器等高級用法一網(wǎng)打盡。此外,我還將分享一些獨(dú)特的見解和研究發(fā)現(xiàn),希望能給你帶來新的啟發(fā)。文章的結(jié)尾,我們將有一個 \\\"One M

    2024年02月10日
    瀏覽(17)
  • < Python全景系列-3 > Python控制流程盤點及高級用法、神秘技巧大揭秘!

    歡迎來到我們的系列博客《Python全景系列》!在這個系列中,我們將帶領(lǐng)你從Python的基礎(chǔ)知識開始,一步步深入到高級話題,幫助你掌握這門強(qiáng)大而靈活的編程語法。無論你是編程新手,還是有一定基礎(chǔ)的開發(fā)者,這個系列都將提供你需要的知識和技能。 ? 這是系列第三篇,

    2024年02月05日
    瀏覽(19)
  • 翻譯: Streamlit從入門到精通 高級用法緩存Cache和Session 五

    翻譯: Streamlit從入門到精通 高級用法緩存Cache和Session 五

    Streamlit從入門到精通 系列: 翻譯: Streamlit從入門到精通 基礎(chǔ)控件 一 翻譯: Streamlit從入門到精通 顯示圖表Graphs 地圖Map 主題Themes 二 翻譯: Streamlit從入門到精通 構(gòu)建一個機(jī)器學(xué)習(xí)應(yīng)用程序 三 翻譯: Streamlit從入門到精通 部署一個機(jī)器學(xué)習(xí)應(yīng)用程序 四 現(xiàn)在您已經(jīng)了解了 Streamli

    2024年01月18日
    瀏覽(19)
  • LLM大語言模型(三):使用ChatGLM3-6B的函數(shù)調(diào)用功能前先學(xué)會Python的裝飾器

    LLM大語言模型(三):使用ChatGLM3-6B的函數(shù)調(diào)用功能前先學(xué)會Python的裝飾器

    目錄 ChatGLM3-6B的函數(shù)調(diào)用模式示例 本地啟動ChatGLM3-6B工具模式 如何在ChatGLM3-6B里新增一個自定義函數(shù)呢? get_weather基于Python的裝飾器實現(xiàn) 函數(shù)注解@register_tool 現(xiàn)在我們來自定義一個kuakuawo()函數(shù) ChatGLM3-6B目前有三種使用模式: 對話模式 工具模式(也就是本文要介紹的函數(shù)調(diào)用

    2024年01月25日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包