提升Python執行速度,1行程式碼就夠了!
- 2020 年 7 月 13 日
- AI
作者:【七步編程】公眾號
原文:提升Python執行速度,1行程式碼就夠了!
快取是一項從底層到高層都廣泛應用的技術,無論是前端還是後端,有一定開發經驗的程式設計師對快取應該都不陌生。快取是指可以進行高速數據交換的存儲器,它先於記憶體與CPU交換數據,因此速率很快。
在Python開發過程中,有一些函數的結果可能會被反覆調用,如果這個函數耗時較少還無傷大雅。
但是,如果一個函數耗時10分鐘,或者頻繁的發送rest請求,那麼耗時就會呈現非線性上升。
那麼,對於很多開發人員抱怨的Python,是否能夠通過快取來提升它的開發效率?
答案是肯定的!

本文就來介紹如果利用快取這項技術,實現1行程式碼提升Python執行速度。
LRU
不同的程式語言,會有不同 的快取策略,例如,通過哈希映射、優先順序隊列等實現快取。因此,不同的程式語言,在快取的解決方案方面具有很大差異,可能需要幾分鐘,也可能需要幾小時。
但是,在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-050.2073秒對比2.0981e-5秒之間差了4個量級,這樣給人的直觀感受應該就非常強烈了。
在涉及一些簡單運算的過程中,即便是重複計算也無傷大雅。但是,如果涉及大量數據計算或者網路請求這類耗時的計算,利用快取機制,只需要1行程式碼就可以節省可觀的時間。既比重複計算節省時間,也要比多餘定義變數簡單。
往期精選

