目錄javascript
因爲python有動態解釋性語言的特性,跑起代碼來相比java、c++要慢不少,尤爲在作科學計算的時候,十億百億級別的運算,讓python的這種劣勢更加凸顯。
所以就出現瞭解決python慢的一大利器numba,可讓python的運行速度提高上百倍甚至更多!
numpy是爲面向numpy數組的計算任務而設計的。
Numba把NumPy數組類型生成高效的編譯代碼,用於在GPU或多核CPU上執行。
在作大量科學計算時和使用for循環數據較多時,儘可能使用numba。
java
numba是一款能夠將python函數編譯爲機器代碼的JIT編譯器,通過numba編譯的python代碼(僅限數組運算),其運行速度能夠接近C或FORTRAN語言。
numba的做用是給python換一種編譯器。讓代碼直接轉成機器碼運行。
python
使用numba很是簡單,只須要將numba裝飾器應用到python函數中,無需改動本來的python代碼,numba會自動完成剩餘的工做。那麼怎麼使用呢,下面有一個例子。
1.計算numpy數組各個數值的雙曲正切值。
(1)導入numpy、numba及其編譯器c++
import numpy as np import numba from numba import jit
(2)傳入numba裝飾器jit,編寫函數數組
# nopython = True 選項要求徹底編譯該函數(以便徹底刪除Python解釋器調用),不然會引起異常 @jit(nopython=True) # jit,numba裝飾器中的一種 def go_fast2(a): # 首次調用時,函數被編譯爲機器代碼 trace = 0 # 假設輸入變量是numpy數組 for i in range(a.shape[0]): # Numba 擅長處理循環 trace += np.tanh(a[i, i]) # numba喜歡numpy函數 return a + trace # numba喜歡numpy廣播
(3)給函數傳遞實參函數
# 由於函數要求傳入的參數是nunpy數組 x = np.arange(100).reshape(10, 10) # 執行函數 go_fast(x)
(4)經numba加速的函數執行時間大數據
% timeit go_fast(x)
(5)結果輸出設計
3.63 µs ± 156 ns #加速後 136 µs ± 1.09 µs #不加速
快了40倍。code
2.nunba對for循環的加速
(1)代碼ip
# 普通函數 def go_fast1(): # 首次調用時,函數被編譯爲機器代碼 x = 0 for i in np.arange(5000): x += i return x # nopython = True選項要求徹底編譯該函數(以便徹底刪除Python解釋器調用),不然會引起異常 @jit(nopython=True) # jit,numba裝飾器中的一種 def go_fast2(): # 首次調用時,函數被編譯爲機器代碼 x = 0 for i in np.arange(5000): x += i return x
(2)結果輸出
1.57 µs ± 53.8 ns #加速後 408 µs ± 9.73 µs #不加速
快了200倍。 numba對python代碼運行速度有巨大的提高,這極大的促進了大數據時代的python數據分析能力,但不會對numpy和for循環之外的python代碼有很大幫助,對數據科學工做者來講,這真是一個好技術!