日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

numba安装与使用

發(fā)布時(shí)間:2023/12/3 综合教程 36 生活家
生活随笔 收集整理的這篇文章主要介紹了 numba安装与使用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、numba是什么

Numba是一個(gè)針對(duì)Python的開(kāi)源JIT編譯器,由Anaconda公司主導(dǎo)開(kāi)發(fā),可以對(duì)Python原生代碼進(jìn)行CPU和GPU加速。Numba對(duì)NumPy數(shù)組和函數(shù)非常友好。解釋器可以參考第四章內(nèi)容。

CUDA C編程開(kāi)發(fā)成本高,所以一般會(huì)用python先嘗試加速模型訓(xùn)練。numba包就是python提供的GPU編程開(kāi)發(fā)包。只管調(diào)用就對(duì)了。

除此之外還有很多,比方說(shuō)等價(jià)于numpy的cupy,用于矩陣運(yùn)算,pycuda之類(lèi)的,tensorflow,pytorch等等。

參考這篇文章:numba與cupy

二、numba下載與安裝

使用conda安裝Numba:

$ conda install numba

或者使用pip安裝:

$ pip install numba

三、numba的使用

使用方法很簡(jiǎn)單,想寫(xiě)好真不容易!!!

from numba import jit
import numpy as npa = np.arange(10)
b = np.arange(1,11)@jit
def test():return a+btest()

我們只需要在原來(lái)的代碼上添加一行@jit,即可將一個(gè)函數(shù)編譯成機(jī)器碼,其他地方都不需要更改。@符號(hào)裝飾了原來(lái)的代碼,所以稱(chēng)類(lèi)似寫(xiě)法為裝飾器。

這里裝飾的函數(shù)調(diào)用的API是有限制的!!!!比如pandas是更高層次的封裝,Numba其實(shí)不能理解它里面做了什么,所以無(wú)法對(duì)其加速。一些大家經(jīng)常用的機(jī)器學(xué)習(xí)框架,如scikit-learn,tensorflow,pytorch等,已經(jīng)做了大量的優(yōu)化,不適合再使用Numba做加速。

此外,Numba不支持:try…except 異常處理,with 語(yǔ)句,類(lèi)定義class,yield from

Numba的@jit裝飾器就像自動(dòng)駕駛,用戶(hù)不需要關(guān)注到底是如何優(yōu)化的,Numba去嘗試進(jìn)行優(yōu)化,如果發(fā)現(xiàn)不支持,那么Numba會(huì)繼續(xù)用Python原來(lái)的方法去執(zhí)行該函數(shù),即圖 Python解釋器工作原理中左側(cè)部分。這種模式被稱(chēng)為object模式。

Numba真正牛逼之處在于其nopython模式。將裝飾器改為@jit(nopython=True)或者@njit,Numba會(huì)假設(shè)你已經(jīng)對(duì)所加速的函數(shù)非常了解,強(qiáng)制使用加速的方式,不會(huì)進(jìn)入object模式,如編譯不成功,則直接拋出異常。nopython的名字會(huì)有點(diǎn)歧義,我們可以理解為不使用很慢的Python,強(qiáng)制進(jìn)入圖 Python解釋器工作原理中右側(cè)部。簡(jiǎn)而言之,無(wú)腦nonpython模式就對(duì)了!!!!

注意點(diǎn)一

Numba庫(kù)提供的是一種懶編譯(Lazy Compilation)技術(shù),即在運(yùn)行過(guò)程中第一次發(fā)現(xiàn)代碼中有@jit,才將該代碼塊編譯。用到的時(shí)候才編譯,看起來(lái)比較懶,所以叫懶編譯。使用Numba時(shí),總時(shí)間 = 編譯時(shí)間 + 運(yùn)行時(shí)間。相比所能節(jié)省的計(jì)算時(shí)間,編譯的時(shí)間開(kāi)銷(xiāo)很小,所以物有所值。對(duì)于一個(gè)需要多次調(diào)用的Numba函數(shù),只需要編譯一次,后面再調(diào)用時(shí)就不需要編譯了。

注意點(diǎn)二

原生Python速度慢的另一個(gè)重要原因是變量類(lèi)型不確定。聲明一個(gè)變量的語(yǔ)法很簡(jiǎn)單,如a = 1,但沒(méi)有指定a到底是一個(gè)整數(shù)和一個(gè)浮點(diǎn)小數(shù)。Python解釋器要進(jìn)行大量的類(lèi)型推斷,會(huì)非常耗時(shí)。同樣,引入Numba后,Numba也要推斷輸入輸出的類(lèi)型,才能轉(zhuǎn)化為機(jī)器碼。針對(duì)這個(gè)問(wèn)題,Numba給出了名為Eager Compilation的優(yōu)化方式。

from numba import jit, int32@jit("int32(int32, int32)", nopython=True)
def f2(x, y):return x + y

@jit(int32(int32, int32))告知Numba你的函數(shù)在使用什么樣的輸入和輸出,括號(hào)內(nèi)是輸入,括號(hào)左側(cè)是輸出。這樣不會(huì)加快執(zhí)行速度,但是會(huì)加快編譯速度,可以更快將函數(shù)編譯到機(jī)器碼上。

具體用法參考皮皮魯?shù)目萍夹乔?/p>

調(diào)用cuda,不需要選擇njit修飾器,用cuda.jit即可

from numba import cuda
@cuda.jit
def gpu_add(a, b, result, N):idxWithinGrid = cuda.threadIdx.x + cuda.blockIdx.x * cuda.blockDim.x gridStride = cuda.gridDim.x * cuda.blockDim.xfor i in range(idxWithinGrid, N, gridStride):result[i] = a[i] + b[i]

四、numba的原理

python慢的原因主要是因?yàn)榻忉屍鳌=鉀Q辦法有倆個(gè),一種解決辦法是使用C/C++語(yǔ)言重寫(xiě)Python函數(shù),但是這要求程序員對(duì)C/C++語(yǔ)言熟悉,且調(diào)試速度慢,不適合絕大多數(shù)Python程序員。另外一種非常方便快捷的解決辦法就是使用Just-In-Time(JIT)技術(shù)。

Just-In-Time(JIT)技術(shù)為解釋語(yǔ)言提供了一種優(yōu)化,它能克服上述效率問(wèn)題,極大提升代碼執(zhí)行速度,同時(shí)保留Python語(yǔ)言的易用性。使用JIT技術(shù)時(shí),JIT編譯器將Python源代碼編譯成機(jī)器直接可以執(zhí)行的機(jī)器語(yǔ)言,并可以直接在CPU等硬件上運(yùn)行。這樣就跳過(guò)了原來(lái)的虛擬機(jī),執(zhí)行速度幾乎與用C語(yǔ)言編程速度并無(wú)二致。

總結(jié)

以上是生活随笔為你收集整理的numba安装与使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。