利用Numba與Cython結(jié)合提升python運行效率詳解
Numba
Numba是一個即時(JIT)編譯器,它將Python代碼轉(zhuǎn)換為用于CPU和GPU的本地機器指令。代碼可以在導入時、運行時或提前編譯。
通過使用jit裝飾器,使用Numba非常容易:
正如你所知道的,在Python中,所有代碼塊都被編譯成字節(jié)碼:
代碼優(yōu)化
為了優(yōu)化Python代碼,Numba從提供的函數(shù)中提取一個字節(jié)碼,并在其上運行一組分析器。Python字節(jié)碼包含一系列小而簡單的指令,因此不必從Python實現(xiàn)中使用源代碼就可以從字節(jié)碼中重構(gòu)函數(shù)的邏輯。轉(zhuǎn)換的過程涉及多個階段,但Numba將Python字節(jié)碼轉(zhuǎn)換為LLVM中間表示 (IR)。
請注意,LLVM IR是一種低級編程語言,它類似于匯編語法,與Python無關。
Numba 模式
Numba中有兩種模式:nopython 和 object。前者不使用Python運行時并且在沒有Python依賴項的情況下生成本機代碼。 本機代碼是靜態(tài)類型的,運行非常快。而對象模式使用Python對象和Python C API,這通常不會帶來顯著的速度改進。在這兩種情況下,Python代碼都是使用LLVM編譯的。
什么是LLVM?
LLVM是一種編譯器,它采用代碼的特殊中間表示(IR),并將其編譯成本機代碼。編譯過程涉及許多額外的傳遞,其中編譯器優(yōu)化IR。LLVM工具鏈很好地優(yōu)化了IR,不僅為Numba編譯代碼,而且優(yōu)化Numba。整個系統(tǒng)大致如下:
Python numba 體系結(jié)構(gòu)
Numba的優(yōu)勢:
- 易用性
- 自動并行化
- 支持numpy操作和對象
- GPU支持
Numba的劣勢:
多層的抽象使得調(diào)試和優(yōu)化變得非常困難
在nopython模式下無法與Python及其模塊進行交互
有限的類支持
Cython
取代分析字節(jié)碼和生成IR,Cython使用Python語法的超集,它后來轉(zhuǎn)換成C代碼。在使用Cython時,基本上是用高級Python語法編寫C代碼。
在Cython中,通常不必擔心Python包裝器和低級API調(diào)用,因為所有交互都會自動擴展到合適的C代碼。
與Numba不同,所有的Cython代碼應該在專門文件中與常規(guī)Python代碼分開。Cython將這些文件解析并轉(zhuǎn)換成C代碼,然后使用提供的C編譯器 (例如, gcc)編譯它。
Python代碼已經(jīng)是有效的Cython代碼。
但是,類型版本工作得更快。
編寫快速Cython代碼需要理解C和Python內(nèi)部結(jié)構(gòu)。如果你熟悉C,你的Cython代碼可以運行得和C代碼一樣快。
Cython的優(yōu)勢:
- 通過Python API的使用控制
- 與C/C++庫和C/C++代碼的簡單接口
- 并行執(zhí)行支持
- 支持Python類,在C中提供面向?qū)ο蟮奶匦?/li>
Cython的劣勢:
- 學習曲線
- 需要C和Python內(nèi)部專業(yè)技術
- 模塊的組織不方便
Numba 對 Cython
就個人而言,我更喜歡小項目和ETL實驗用Numba。你可以將其插入現(xiàn)有項目中。如果我需要啟動一個大項目或為C庫編寫包裝器,我將使用Cython,因為它提供更多的控制和更容易調(diào)試。
此外,Cython是許多庫的標準,如pandas、scikit-learn、scipy、Spacy、gensim和lxml。
以上就是利用Numba與Cython結(jié)合提升python運行效率詳解的詳細內(nèi)容,更多關于提升python運行效率的資料請關注腳本之家其它相關文章!
相關文章
python 將數(shù)據(jù)保存為excel的xls格式(實例講解)
下面小編就為大家分享一篇python 將數(shù)據(jù)保存為excel的xls格式(實例講解),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05python時間與Unix時間戳相互轉(zhuǎn)換方法詳解
這篇文章主要介紹了python時間與Unix時間戳相互轉(zhuǎn)換方法詳解,需要的朋友可以參考下2020-02-02詳解pandas數(shù)據(jù)合并與重塑(pd.concat篇)
這篇文章主要介紹了詳解pandas數(shù)據(jù)合并與重塑(pd.concat篇),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-07-07Python編程實現(xiàn)雙鏈表,棧,隊列及二叉樹的方法示例
這篇文章主要介紹了Python編程實現(xiàn)雙鏈表,棧,隊列及二叉樹的方法,結(jié)合具體實例形式分析了Python簡單實現(xiàn)數(shù)據(jù)結(jié)構(gòu)中雙鏈表,棧,隊列及二叉樹相關操作技巧,需要的朋友可以參考下2017-11-11