欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用Numba與Cython結(jié)合提升python運(yùn)行效率詳解

 更新時(shí)間:2021年09月08日 15:51:53   作者:Python文澤老師  
近些年來(lái), Numba和Cython在數(shù)學(xué)科學(xué)界得到了廣泛的關(guān)注。它們都提供了一種加速CPU密集型任務(wù)的方法,但以不同的方式。本文描述了它們之間體系結(jié)構(gòu)的差異

Numba

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

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

Numba和Cython如何加速Python代碼

image.png

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

image.png

代碼優(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)換的過程涉及多個(gè)階段,但Numba將Python字節(jié)碼轉(zhuǎn)換為L(zhǎng)LVM中間表示 (IR)。

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

Numba 模式

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

什么是LLVM?

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

Numba和Cython如何加速Python代碼

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)行交互

有限的類支持

Cython

取代分析字節(jié)碼和生成IR,Cython使用Python語(yǔ)法的超集,它后來(lái)轉(zhuǎn)換成C代碼。在使用Cython時(shí),基本上是用高級(jí)Python語(yǔ)法編寫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如何加速Python代碼

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

Numba和Cython如何加速Python代碼

Numba和Cython如何加速Python代碼

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

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

  • 通過Python API的使用控制
  • 與C/C++庫(kù)和C/C++代碼的簡(jiǎn)單接口
  • 并行執(zhí)行支持
  • 支持Python類,在C中提供面向?qū)ο蟮奶匦?/li>

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)镃庫(kù)編寫包裝器,我將使用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)文章!

相關(guān)文章

  • python 將數(shù)據(jù)保存為excel的xls格式(實(shí)例講解)

    python 將數(shù)據(jù)保存為excel的xls格式(實(shí)例講解)

    下面小編就為大家分享一篇python 將數(shù)據(jù)保存為excel的xls格式(實(shí)例講解),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2018-05-05
  • python時(shí)間與Unix時(shí)間戳相互轉(zhuǎn)換方法詳解

    python時(shí)間與Unix時(shí)間戳相互轉(zhuǎn)換方法詳解

    這篇文章主要介紹了python時(shí)間與Unix時(shí)間戳相互轉(zhuǎn)換方法詳解,需要的朋友可以參考下
    2020-02-02
  • Python中else的三種使用場(chǎng)景

    Python中else的三種使用場(chǎng)景

    在Python中else最常見的用法就是用在判斷語(yǔ)句中,其實(shí)還可以用在循環(huán)語(yǔ)句和異常處理中。 下面來(lái)總結(jié)一下else的用法:
    2021-06-06
  • 使用pth文件添加Python環(huán)境變量方式

    使用pth文件添加Python環(huán)境變量方式

    這篇文章主要介紹了使用pth文件添加Python環(huán)境變量方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-05-05
  • 詳解pandas數(shù)據(jù)合并與重塑(pd.concat篇)

    詳解pandas數(shù)據(jù)合并與重塑(pd.concat篇)

    這篇文章主要介紹了詳解pandas數(shù)據(jù)合并與重塑(pd.concat篇),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python找出9個(gè)連續(xù)的空閑端口

    Python找出9個(gè)連續(xù)的空閑端口

    這篇文章主要介紹了Python找出9個(gè)連續(xù)的空閑端口的方法,感興趣的小伙伴們可以參考一下
    2016-02-02
  • Python編程實(shí)現(xiàn)雙鏈表,棧,隊(duì)列及二叉樹的方法示例

    Python編程實(shí)現(xiàn)雙鏈表,棧,隊(duì)列及二叉樹的方法示例

    這篇文章主要介紹了Python編程實(shí)現(xiàn)雙鏈表,棧,隊(duì)列及二叉樹的方法,結(jié)合具體實(shí)例形式分析了Python簡(jiǎn)單實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)中雙鏈表,棧,隊(duì)列及二叉樹相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • 用Cython加速Python到“起飛”(推薦)

    用Cython加速Python到“起飛”(推薦)

    這篇文章主要介紹了用Cython加速Python到“起飛”,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 公認(rèn)8個(gè)效率最高的爬蟲框架

    公認(rèn)8個(gè)效率最高的爬蟲框架

    在本篇文章里小編給大家整理的是關(guān)于2020年8個(gè)效率最高的爬蟲框架知識(shí)點(diǎn),需要的朋友們可以學(xué)習(xí)下。
    2020-07-07
  • Python中@符號(hào)的用法小結(jié)

    Python中@符號(hào)的用法小結(jié)

    @符號(hào)在Python中最常見的使用情況是在裝飾器中,本文主要介紹了Python中@符號(hào)的用法小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09

最新評(píng)論