程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

提升Python執行速度,1行代碼就夠了

編輯:Python

緩存是一項從底層到高層都廣泛應用的技術,無論是前端還是後端,有一定開發經驗的程序員對緩存應該都不陌生。緩存是指可以進行高速數據交換的存儲器,它先於內存與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-05

0.2073秒對比2.0981e-5秒之間差了4個量級,這樣給人的直觀感受應該就非常強烈了。

在涉及一些簡單運算的過程中,即便是重復計算也無傷大雅。但是,如果涉及大量數據計算或者網絡請求這類耗時的計算,利用緩存機制,只需要1行代碼就可以節省可觀的時間。既比重復計算節省時間,也要比多余定義變量簡單。

 【python學習】
學Python的伙伴,歡迎加入新的交流【君羊】:1020465983
一起探討編程知識,成為大神,群裡還有軟件安裝包,實戰案例、學習資料


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved