溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用Numba與Cython結(jié)合提升python運(yùn)行效率

發(fā)布時(shí)間:2021-09-11 17:27:12 來源:億速云 閱讀:572 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹如何使用Numba與Cython結(jié)合提升python運(yùn)行效率,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

    Numba

    Numba是一個(gè)即時(shí)(JIT)編譯器,它將Python代碼轉(zhuǎn)換為用于CPU和GPU的本地機(jī)器指令。代碼可以在導(dǎo)入時(shí)、運(yùn)行時(shí)或提前編譯。

    通過使用jit裝飾器,使用Numba非常容易:

    如何使用Numba與Cython結(jié)合提升python運(yùn)行效率

    如何使用Numba與Cython結(jié)合提升python運(yùn)行效率

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

    如何使用Numba與Cython結(jié)合提升python運(yùn)行效率

    代碼優(yōu)化

    為了優(yōu)化Python代碼,Numba從提供的函數(shù)中提取一個(gè)字節(jié)碼,并在其上運(yùn)行一組分析器。Python字節(jié)碼包含一系列小而簡單的指令,因此不必從Python實(shí)現(xiàn)中使用源代碼就可以從字節(jié)碼中重構(gòu)函數(shù)的邏輯。轉(zhuǎn)換的過程涉及多個(gè)階段,但Numba將Python字節(jié)碼轉(zhuǎn)換為LLVM中間表示 (IR)。

    請(qǐng)注意,LLVM IR是一種低級(jí)編程語言,它類似于匯編語法,與Python無關(guān)。

    Numba 模式

    Numba中有兩種模式:nopython 和 object。前者不使用Python運(yùn)行時(shí)并且在沒有Python依賴項(xiàng)的情況下生成本機(jī)代碼。 本機(jī)代碼是靜態(tài)類型的,運(yùn)行非???。而對(duì)象模式使用Python對(duì)象和Python C API,這通常不會(huì)帶來顯著的速度改進(jìn)。在這兩種情況下,Python代碼都是使用LLVM編譯的。

    什么是LLVM?

    LLVM是一種編譯器,它采用代碼的特殊中間表示(IR),并將其編譯成本機(jī)代碼。編譯過程涉及許多額外的傳遞,其中編譯器優(yōu)化IR。LLVM工具鏈很好地優(yōu)化了IR,不僅為Numba編譯代碼,而且優(yōu)化Numba。整個(gè)系統(tǒng)大致如下:

    如何使用Numba與Cython結(jié)合提升python運(yùn)行效率

    Python numba 體系結(jié)構(gòu)

    Numba的優(yōu)勢(shì):
    • 易用性

    • 自動(dòng)并行化

    • 支持numpy操作和對(duì)象

    • GPU支持

    Numba的劣勢(shì):

    多層的抽象使得調(diào)試和優(yōu)化變得非常困難

    在nopython模式下無法與Python及其模塊進(jìn)行交互

    有限的類支持

    Cython

    取代分析字節(jié)碼和生成IR,Cython使用Python語法的超集,它后來轉(zhuǎn)換成C代碼。在使用Cython時(shí),基本上是用高級(jí)Python語法編寫C代碼。

    在Cython中,通常不必?fù)?dān)心Python包裝器和低級(jí)API調(diào)用,因?yàn)樗薪换ザ紩?huì)自動(dòng)擴(kuò)展到合適的C代碼。

    與Numba不同,所有的Cython代碼應(yīng)該在專門文件中與常規(guī)Python代碼分開。Cython將這些文件解析并轉(zhuǎn)換成C代碼,然后使用提供的C編譯器 (例如, gcc)編譯它。

    Python代碼已經(jīng)是有效的Cython代碼。

    如何使用Numba與Cython結(jié)合提升python運(yùn)行效率

    但是,類型版本工作得更快。

    如何使用Numba與Cython結(jié)合提升python運(yùn)行效率

    如何使用Numba與Cython結(jié)合提升python運(yùn)行效率

    編寫快速Cython代碼需要理解C和Python內(nèi)部結(jié)構(gòu)。如果你熟悉C,你的Cython代碼可以運(yùn)行得和C代碼一樣快。

    Cython的優(yōu)勢(shì):

    • 通過Python API的使用控制

    • 與C/C++庫和C/C++代碼的簡單接口

    • 并行執(zhí)行支持

    • 支持Python類,在C中提供面向?qū)ο蟮奶匦?/p>

    Cython的劣勢(shì):

    • 學(xué)習(xí)曲線

    • 需要C和Python內(nèi)部專業(yè)技術(shù)

    • 模塊的組織不方便

    Numba 對(duì) Cython

    就個(gè)人而言,我更喜歡小項(xiàng)目和ETL實(shí)驗(yàn)用Numba。你可以將其插入現(xiàn)有項(xiàng)目中。如果我需要啟動(dòng)一個(gè)大項(xiàng)目或?yàn)镃庫編寫包裝器,我將使用Cython,因?yàn)樗峁└嗟目刂坪透菀渍{(diào)試。

    此外,Cython是許多庫的標(biāo)準(zhǔn),如pandas、scikit-learn、scipy、Spacy、gensim和lxml。

    以上是“如何使用Numba與Cython結(jié)合提升python運(yùn)行效率”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI