目錄
- Numba
- Numba 模式
- 什么是LLVM?
- Numba的優(yōu)勢(shì):
- Numba的劣勢(shì):
- Cython
- Cython的優(yōu)勢(shì):
- Cython的劣勢(shì):
- Numba 對(duì) Cython
Numba
Numba是一個(gè)即時(shí)(JIT)編譯器,它將Python代碼轉(zhuǎn)換為用于CPU和GPU的本地機(jī)器指令。代碼可以在導(dǎo)入時(shí)、運(yùn)行時(shí)或提前編譯。
通過(guò)使用jit裝飾器,使用Numba非常容易:


正如你所知道的,在Python中,所有代碼塊都被編譯成字節(jié)碼:

代碼優(yōu)化
為了優(yōu)化Python代碼,Numba從提供的函數(shù)中提取一個(gè)字節(jié)碼,并在其上運(yùn)行一組分析器。Python字節(jié)碼包含一系列小而簡(jiǎn)單的指令,因此不必從Python實(shí)現(xiàn)中使用源代碼就可以從字節(jié)碼中重構(gòu)函數(shù)的邏輯。轉(zhuǎn)換的過(guò)程涉及多個(gè)階段,但Numba將Python字節(jié)碼轉(zhuǎn)換為L(zhǎng)LVM中間表示 (IR)。
請(qǐng)注意,LLVM IR是一種低級(jí)編程語(yǔ)言,它類(lèi)似于匯編語(yǔ)法,與Python無(wú)關(guān)。
Numba 模式
Numba中有兩種模式:nopython 和 object。前者不使用Python運(yùn)行時(shí)并且在沒(méi)有Python依賴(lài)項(xiàng)的情況下生成本機(jī)代碼。 本機(jī)代碼是靜態(tài)類(lèi)型的,運(yùn)行非??臁6鴮?duì)象模式使用Python對(duì)象和Python C API,這通常不會(huì)帶來(lái)顯著的速度改進(jìn)。在這兩種情況下,Python代碼都是使用LLVM編譯的。
什么是LLVM?
LLVM是一種編譯器,它采用代碼的特殊中間表示(IR),并將其編譯成本機(jī)代碼。編譯過(guò)程涉及許多額外的傳遞,其中編譯器優(yōu)化IR。LLVM工具鏈很好地優(yōu)化了IR,不僅為Numba編譯代碼,而且優(yōu)化Numba。整個(gè)系統(tǒng)大致如下:

Python numba 體系結(jié)構(gòu)
Numba的優(yōu)勢(shì):
- 易用性
- 自動(dòng)并行化
- 支持numpy操作和對(duì)象
- GPU支持
Numba的劣勢(shì):
多層的抽象使得調(diào)試和優(yōu)化變得非常困難
在nopython模式下無(wú)法與Python及其模塊進(jìn)行交互
有限的類(lèi)支持
Cython
取代分析字節(jié)碼和生成IR,Cython使用Python語(yǔ)法的超集,它后來(lái)轉(zhuǎn)換成C代碼。在使用Cython時(shí),基本上是用高級(jí)Python語(yǔ)法編寫(xiě)C代碼。
在Cython中,通常不必?fù)?dān)心Python包裝器和低級(jí)API調(diào)用,因?yàn)樗薪换ザ紩?huì)自動(dòng)擴(kuò)展到合適的C代碼。
與Numba不同,所有的Cython代碼應(yīng)該在專(zhuān)門(mén)文件中與常規(guī)Python代碼分開(kāi)。Cython將這些文件解析并轉(zhuǎn)換成C代碼,然后使用提供的C編譯器 (例如, gcc)編譯它。
Python代碼已經(jīng)是有效的Cython代碼。

但是,類(lèi)型版本工作得更快。


編寫(xiě)快速Cython代碼需要理解C和Python內(nèi)部結(jié)構(gòu)。如果你熟悉C,你的Cython代碼可以運(yùn)行得和C代碼一樣快。
Cython的優(yōu)勢(shì):
- 通過(guò)Python API的使用控制
- 與C/C++庫(kù)和C/C++代碼的簡(jiǎn)單接口
- 并行執(zhí)行支持
- 支持Python類(lèi),在C中提供面向?qū)ο蟮奶匦?/li>
Cython的劣勢(shì):
- 學(xué)習(xí)曲線(xiàn)
- 需要C和Python內(nèi)部專(zhuān)業(yè)技術(shù)
- 模塊的組織不方便
Numba 對(duì) Cython
就個(gè)人而言,我更喜歡小項(xiàng)目和ETL實(shí)驗(yàn)用Numba。你可以將其插入現(xiàn)有項(xiàng)目中。如果我需要啟動(dòng)一個(gè)大項(xiàng)目或?yàn)镃庫(kù)編寫(xiě)包裝器,我將使用Cython,因?yàn)樗峁└嗟目刂坪透菀渍{(diào)試。
此外,Cython是許多庫(kù)的標(biāo)準(zhǔn),如pandas、scikit-learn、scipy、Spacy、gensim和lxml。
以上就是利用Numba與Cython結(jié)合提升python運(yùn)行效率詳解的詳細(xì)內(nèi)容,更多關(guān)于提升python運(yùn)行效率的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- 詳解如何利用Cython為Python代碼加速
- 使用numba對(duì)Python運(yùn)算加速的方法
- 基于Numba提高python運(yùn)行效率過(guò)程解析
- 讓Python代碼更快運(yùn)行的5種方法
- 幾個(gè)提升Python運(yùn)行效率的方法之間的對(duì)比
- 六個(gè)竅門(mén)助你提高Python運(yùn)行效率
- 能讓Python提速超40倍的神器Cython詳解