Python中的numba的基本應用!讓你的Python快一萬倍!

一起學Python呀發表於2018-07-11
Python中的numba的基本應用!讓你的Python快一萬倍!

Python中的numba的基本應用!讓你的Python快一萬倍!

Python中的numba的基本應用!讓你的Python快一萬倍!

可以看到幾乎有 200 倍的差距,這當然是無法忍受的。為此,我們可以用vectorize來定義出類似於Ufunc的函式:

Python中的numba的基本應用!讓你的Python快一萬倍!

雖然還是慢了 2 倍左右,但已經好很多了

然後有幾點需要注意的地方:

* vectorize下的函式所接受的引數都是一個個的數而非整個陣列。所以上述add_with_vec的引數yy其實是輸入陣列y中的元素,而不是y本身。更詳細的說明可以參見官方文件)

* 可以看到當常數 c 是整數和是浮點數時、速度是不同的。個人猜測這是因為若常數 c 為整數,那麼實際運算時需要將它轉化為浮點數,從而導致速度變慢

* 上述程式碼中我們沒有顯式地定義函式的引數型別和返回型別,但我們可以預先定義。比如說,如果我確定常數 c 就是整數的話,我就可以這樣寫:

Python中的numba的基本應用!讓你的Python快一萬倍!

雖說在普通的 Python3.6.1 下、執行結果將如下:

73.5 µs ± 4.22 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

21.2 µs ± 734 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

似乎還變慢了;不過如果使用 Intel Distribution for Python 的話,會發現parallel版本甚至會比numpy原生的版本要稍快一些

Python中的numba的基本應用!讓你的Python快一萬倍!

這個栗子中的效能提升就是實打實的了。總之,使用parallel時不能一概而論,還是要做些實驗需要指出的是,vectorize中的引數target一共有三種取值:cpu(預設)、parallel和cuda。關於選擇哪個取值,官方文件上有很好的說明:

Python中的numba的基本應用!讓你的Python快一萬倍!

使用 jit(nogil=True) 實現高效併發(多執行緒)我們知道,Python 中由於有 GIL 的存在,所以多執行緒用起來非常不舒服。不過 numba 的 jit 裡面有一項引數叫 nogil,想來聰明的觀眾老爺們都猜到了它是幹什麼的了……

下面就來看一個栗子:

Python中的numba的基本應用!讓你的Python快一萬倍!

Python中的numba的基本應用!讓你的Python快一萬倍!

numba 的應用例項 —— 卷積與池化如果只想看效果的話倒沒什麼關係,不過如果想知道我具體在幹什麼的話,可以參見這篇文章

首先是卷積操作:

Python中的numba的基本應用!讓你的Python快一萬倍!

Python中的numba的基本應用!讓你的Python快一萬倍!

那麼程式的執行結果將會是:

281 ms ± 12.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

66.2 ms ± 2.32 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

可以看到這又快了 3 倍左右

接下來是池化操作(我們選用的是 MaxPool):

Python中的numba的基本應用!讓你的Python快一萬倍!

Python中的numba的基本應用!讓你的Python快一萬倍!

Python中的numba的基本應用!讓你的Python快一萬倍!

進群:125240963   即可獲取數十套PDF哦!

Python中的numba的基本應用!讓你的Python快一萬倍!

相關文章