由於python有動態解釋性語言的特性,跑起代碼來相比java、c++要慢很多,尤其在做科學計算的時候,十億百億級別的運算,讓python的這種劣勢更加凸顯。
因此就出現了解決python慢的一大利器numba,可以讓python的運行速度提升上百倍甚至更多!
numpy是為面向numpy數組的計算任務而設計的。
Numba把NumPy數組類型生成高效的編譯代碼,用於在GPU或多核CPU上執行。
在做大量科學計算時和使用for循環數據較多時,盡量使用numba。
一:什么是numba
numba是一款可以將python函數編譯為機器代碼的JIT編譯器,經過numba編譯的python代碼(僅限數組運算),其運行速度可以接近C或FORTRAN語言。
numba的作用是給python換一種編譯器。讓代碼直接轉成機器碼運行。
二:如何使用numba
使用numba非常簡單,只需要將numba裝飾器應用到python函數中,無需改動原本的python代碼,numba會自動完成剩余的工作。那么怎么使用呢,下面有一個例子。
1.計算numpy數組各個數值的雙曲正切值。
(1)導入numpy、numba及其編譯器
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倍。
2.nunba對for循環的加速
(1)代碼
# 普通函數
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代碼有很大幫助,對數據科學工作者來說,這真是一個好技術!