python numba講解


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM