您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關(guān)python如何利用自帶的緩存機制提高效率,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
利用自帶的緩存機制提高效率
緩存是一種將定量數(shù)據(jù)加以保存,以備迎合后續(xù)獲取需求的處理方式,旨在加快數(shù)據(jù)獲取的速度。
數(shù)據(jù)的生成過程可能需要經(jīng)過計算,規(guī)整,遠程獲取等操作,如果是同一份數(shù)據(jù)需要多次使用,每次都重新生成會大大浪費時間。所以,如果將計算或者遠程請求等操作獲得的數(shù)據(jù)緩存下來,會加快后續(xù)的數(shù)據(jù)獲取需求。
為了實現(xiàn)這個需求,Python 3.2 + 中給我們提供了一個機制,可以很方便的實現(xiàn),而不需要你去寫這樣的邏輯代碼。
這個機制實現(xiàn)于 functool 模塊中的 lru_cache 裝飾器。
@functools.lru_cache(maxsize=None, typed=False)
參數(shù)解讀:
maxsize:最多可以緩存多少個此函數(shù)的調(diào)用結(jié)果,如果為None,則無限制,設(shè)置為 2 的冪時,性能最佳
typed:若為 True,則不同參數(shù)類型的調(diào)用將分別緩存。
舉個例子
from functools import lru_cache @lru_cache(None) def add(x, y): print("calculating: %s + %s" % (x, y)) return x + y print(add(1, 2)) print(add(1, 2)) print(add(2, 3))
輸出如下,可以看到第二次調(diào)用并沒有真正的執(zhí)行函數(shù)體,而是直接返回緩存里的結(jié)果
calculating: 1 + 2 3 3 calculating: 2 + 3 5
下面這個是經(jīng)典的斐波那契數(shù)列,當(dāng)你指定的 n 較大時,會存在大量的重復(fù)計算
def fib(n): if n < 2: return n return fib(n - 2) + fib(n - 1)
第六點介紹的 timeit,現(xiàn)在可以用它來測試一下到底可以提高多少的效率。
不使用 lru_cache 的情況下,運行時間 31 秒
import timeit def fib(n): if n < 2: return n return fib(n - 2) + fib(n - 1) print(timeit.timeit(lambda :fib(40), number=1)) # output: 31.2725698948
由于使用了 lru_cache 后,運行速度實在太快了,所以我將 n 值由 30 調(diào)到 500,可即使是這樣,運行時間也才 0.0004 秒。提高速度非常顯著。
import timeit from functools import lru_cache @lru_cache(None) def fib(n): if n < 2: return n return fib(n - 2) + fib(n - 1) print(timeit.timeit(lambda :fib(500), number=1)) # output: 0.0004921059880871326
關(guān)于“python如何利用自帶的緩存機制提高效率”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。