python numba講解

  因爲python有動態解釋性語言的特性,跑起代碼來相比java、c++要慢不少,尤爲在作科學計算的時候,十億百億級別的運算,讓python的這種劣勢更加凸顯。

  所以就出現瞭解決python慢的一大利器numba,可讓python的運行速度提高上百倍甚至更多!

  numpy是爲面向numpy數組的計算任務而設計的。

  Numba把NumPy數組類型生成高效的編譯代碼,用於在GPU或多核CPU上執行。

  在作大量科學計算時和使用for循環數據較多時,儘可能使用numba。


java

一:什麼是numba

  numba是一款能夠將python函數編譯爲機器代碼的JIT編譯器,通過numba編譯的python代碼(僅限數組運算),其運行速度能夠接近C或FORTRAN語言。


  numba的做用是給python換一種編譯器。讓代碼直接轉成機器碼運行。


python

二:如何使用numba

  使用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代碼有很大幫助,對數據科學工做者來講,這真是一個好技術!

相關文章
相關標籤/搜索