緩存是一項從底層到高層都廣泛應用的技術,無論是前端還是後端,有一定開發經驗的程序員對緩存應該都不陌生。緩存是指可以進行高速數據交換的存儲器,它先於內存與CPU交換數據,因此速率很快。
在Python開發過程中,有一些函數的結果可能會被反復調用,如果這個函數耗時較少還無傷大雅。
但是,如果一個函數耗時10分鐘,或者頻繁的發送rest請求,那麼耗時就會呈現非線性上升。
那麼,對於很多開發人員抱怨的Python,是否能夠通過緩存來提升它的開發效率?
答案是肯定的!
本文就來介紹如果利用緩存這項技術,實現1行代碼提升Python執行速度。
不同的編程語言,會有不同 的緩存策略,例如,通過哈希映射、優先級隊列等實現緩存。因此,不同的編程語言,在緩存的解決方案方面具有很大差異,可能需要幾分鐘,也可能需要幾小時。
但是,在Python中,標准工具包functools
實現了一種名為LRU(Least Recently Used)的緩存策略,可以通過傳入參數,來設定緩存最近多少次的計算結果,如果傳入參數為None
,那麼會進行無限緩存。
現在,為了讓大家更加容易理解,先來舉一個例子,
import time as tt
def func():
num = 0
for i in range(10):
num += i
return num
def main():
return func() + func() + func() + func() + func() + func() + func()
t1 = tt.time()
main()
print("Time taken: {}".format(tt.time() - t1))
# 9.05990e-6
在這個示例中,反復的調用了func
函數,總共耗時為0.009秒
。
下面,通過functools
工具包下LRU
緩存再跑一下,
import time as tt
import functools
@functools.lru_cache(maxsize=5)
def func():
num = 0
for i in range(10):
num += i
return num
def main():
return func() + func() + func() + func() + func() + func() + func()
t1 = tt.time()
main()
print("Time taken: {}".format(tt.time() - t1))
# 4.768371e-06
通過數據對比,發現運行時間減少了將近50%。
在調用lru_cache
時,需要配置一個maxsize
的參數,它代表著緩存最近幾次的函數計算結果,如果參數為none
則不進行緩存。
通過前面的對比,會發現利用緩存機制時間差別會很大,這是由於,重復調用函數,需要反復執行計算過程,而利用緩存,我們只需要進行快速讀寫,不再需要重復執行計算過程,這樣會節省大部分時間。
但是,由於前面計算過程較為簡單,只涉及簡單的加法運算,在耗時方面給人直觀的感受並不是很強烈。
那下面在以另外斐波那契數列的例子進行對比一下。
應該很多同學對斐波那契數列都不陌生,一個很典型的遞歸問題,在教材上也頻繁的出現。
由於它遞歸計算的過程中,還會用到之前計算的結果,因此會涉及較多的重復計算,下面先看一下正常計算的耗時情況。
import time as tt
def fib(n):
if n <= 1:
return n
return fib(n-1) + fib(n-2)
t1 = tt.time()
fib(30)
print("Time taken: {}".format(tt.time() - t1))
# 0.2073
下面,在利用LRU
對它進行加速,看一下效果,
import time as tt
import functools
@functools.lru_cache(maxsize=5)
def fib(n):
if n <= 1:
return n
return fib(n-1) + fib(n-2)
t1 = tt.time()
fib(30)
print("Time taken: {}".format(tt.time() - t1))
# 1.811981e-05
0.2073秒對比2.0981e-5秒之間差了4個量級,這樣給人的直觀感受應該就非常強烈了。
在涉及一些簡單運算的過程中,即便是重復計算也無傷大雅。但是,如果涉及大量數據計算或者網絡請求這類耗時的計算,利用緩存機制,只需要1行代碼就可以節省可觀的時間。既比重復計算節省時間,也要比多余定義變量簡單。
【python學習】
學Python的伙伴,歡迎加入新的交流【君羊】:1020465983
一起探討編程知識,成為大神,群裡還有軟件安裝包,實戰案例、學習資料