如何在Python中緩存方法調(diào)用?含代碼

如何在Python中緩存方法調(diào)用?

緩存是一種提高程序性能的一種優(yōu)化手段,通過將計(jì)算好的結(jié)果存儲(chǔ)在內(nèi)存中,當(dāng)下一次使用到相同的輸入時(shí),直接從內(nèi)存中獲取結(jié)果,避免重復(fù)計(jì)算。愛掏網(wǎng) - it200.com

Python中的緩存

在Python中,我們可以使用一些第三方庫來實(shí)現(xiàn)緩存功能,如functools庫的lru_cache方法和caching庫等。愛掏網(wǎng) - it200.com下面我們分別來了解如何使用這兩種方式在Python中實(shí)現(xiàn)緩存。愛掏網(wǎng) - it200.com

functools庫的lru_cache方法

functools庫是Python的標(biāo)準(zhǔn)庫之一,提供了許多常用的工具函數(shù)。愛掏網(wǎng) - it200.com其中lru_cache方法可以將函數(shù)的調(diào)用結(jié)果緩存起來,避免重復(fù)計(jì)算。愛掏網(wǎng) - it200.com

假設(shè)我們要寫一個(gè)函數(shù)來計(jì)算n的階乘,遞歸式計(jì)算n!的時(shí)間復(fù)雜度為O(n),而且會(huì)出現(xiàn)大量的重復(fù)計(jì)算。愛掏網(wǎng) - it200.com這時(shí)我們就可以使用lru_cache來緩存計(jì)算結(jié)果,提高計(jì)算效率。愛掏網(wǎng) - it200.com

import functools

@functools.lru_cache(maxsize=256)
def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n - 1)

print(factorial(5)) # 120
print(factorial(10)) # 3628800

上面的代碼中,我們使用lru_cache方法將factorial函數(shù)的調(diào)用結(jié)果緩存起來,當(dāng)下一次調(diào)用相同的輸入時(shí),直接從緩存中獲取結(jié)果,避免重復(fù)計(jì)算。愛掏網(wǎng) - it200.com

在上面的代碼中,我們?cè)O(shè)置了maxsize=256,表示最多存儲(chǔ)256個(gè)調(diào)用結(jié)果。愛掏網(wǎng) - it200.com如果調(diào)用次數(shù)超過了256次,那么早期的調(diào)用結(jié)果將會(huì)被丟棄,以便為新的調(diào)用結(jié)果騰出空間。愛掏網(wǎng) - it200.com

caching庫

caching庫是一個(gè)輕量級(jí)的Python緩存庫,可以方便地對(duì)函數(shù)進(jìn)行緩存。愛掏網(wǎng) - it200.com它提供了兩種方式:內(nèi)存緩存和持久化緩存。愛掏網(wǎng) - it200.com

內(nèi)存緩存只在程序運(yùn)行期間有效,程序重啟后緩存將丟失,而持久化緩存可以將結(jié)果存儲(chǔ)在本地文件系統(tǒng)或數(shù)據(jù)庫中,即使程序重啟也可以從緩存中讀取結(jié)果。愛掏網(wǎng) - it200.com

在下面的例子中,我們展示了如何使用內(nèi)存緩存和持久化緩存來緩存函數(shù)調(diào)用結(jié)果。愛掏網(wǎng) - it200.com

內(nèi)存緩存

from caching import cached

@cached()
def fibonacci(n):
    if n in (0, 1):
        return n
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci(10)) # 55
print(fibonacci(20)) # 6765

上面的代碼中,我們使用cached裝飾器將fibonacci函數(shù)的調(diào)用結(jié)果緩存到內(nèi)存中,下次調(diào)用相同的輸入時(shí),直接從緩存中獲取結(jié)果。愛掏網(wǎng) - it200.com

持久化緩存

當(dāng)內(nèi)存緩存的大小有限時(shí),如果緩存空間不足,早期的結(jié)果將會(huì)被丟棄。愛掏網(wǎng) - it200.com這時(shí)我們可以使用持久化緩存來存儲(chǔ)結(jié)果,以便長(zhǎng)期保存。愛掏網(wǎng) - it200.com

from caching import cached

@cached(cache='file', expire=60)
def fibonacci(n):
    if n in (0, 1):
        return n
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci(10)) # 55
print(fibonacci(20)) # 6765

上面的代碼中,我們使用cached裝飾器將fibonacci函數(shù)的調(diào)用結(jié)果緩存到文件系統(tǒng)中,過期時(shí)間為60秒。愛掏網(wǎng) - it200.com當(dāng)60秒后再次調(diào)用相同的輸入時(shí),將會(huì)重新計(jì)算,重新緩存結(jié)果。愛掏網(wǎng) - it200.com

緩存的注意事項(xiàng)

在使用緩存時(shí),需要考慮以下幾點(diǎn):

緩存的命中率

緩存的命中率表示緩存結(jié)果被使用的比率,命中率越高,說明緩存效果越好。愛掏網(wǎng) - it200.com為了提高緩存的命中率,需要選取恰當(dāng)?shù)木彺娌呗院途彺娲笮 ?b class="xhide">愛掏網(wǎng) - it200.com

緩存的過期時(shí)間

緩存的過期時(shí)間指的是緩存結(jié)果的有效期限,過期后需要重新計(jì)算。愛掏網(wǎng) - it200.com為了避免使用過期的緩存結(jié)果,需要設(shè)置合適的過期時(shí)間,并定時(shí)刷新緩存。愛掏網(wǎng) - it200.com

聲明:所有內(nèi)容來自互聯(lián)網(wǎng)搜索結(jié)果,不保證100%準(zhǔn)確性,僅供參考。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系我們進(jìn)行處理。
發(fā)表評(píng)論
更多 網(wǎng)友評(píng)論0 條評(píng)論)
暫無評(píng)論

返回頂部

主站蜘蛛池模板: 人妻一本久道久久综合久久鬼色| 放荡女同老师和女同学生| 国内精品伊人久久久久妇| 免费a级毛片无码av| 一本色道久久88亚洲精品综合| 老熟妇仑乱一区二区视頻| 日韩精品电影一区| 国产欧美视频高清va在线观看 | 亚洲a∨无码精品色午夜| 18禁美女黄网站色大片免费观看| 欧美色欧美亚洲另类二区| 国内大量揄拍人妻精品視頻 | 美女脱下裤子让男人捅| 成年免费视频黄网站在线观看| 国产三级免费电影| 中文天堂最新版www| 精品国产污污免费网站入口| 少妇无码一区二区二三区| 免费吃奶摸下激烈视频| chinese18国产高清| 波多野结衣在公众被强| 国产精品麻豆高清在线观看| 亚洲成av人片在线观看无| 中文字幕免费在线看线人| 最近2019mv中文字幕免费看| 国产婷婷色综合av蜜臀av| 久久久久九九精品影院| 美女黄18以下禁止观看| 女人是男人的未来视频| 亚洲精品动漫人成3d在线| 18禁无遮挡羞羞污污污污免费| 杨幂13分20秒未删减bt| 国产伦一区二区三区免费| 中文字幕avdvd| 浮力影院国产第一页| 国产精品久久久久久久福利院| 久久精品亚洲一区二区三区浴池 | 国产精品免费视频播放器| 久久综合欧美成人| 色先锋影音资源| 夫不再被公侵犯美若妻|