chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Cython是什么,為什么會(huì)有Cython

python爬蟲(chóng)知識(shí)分享 ? 來(lái)源:python爬蟲(chóng)知識(shí)分享 ? 作者:python爬蟲(chóng)知識(shí)分享 ? 2022-06-16 16:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Cython 估計(jì)很多人都聽(tīng)說(shuō)過(guò),它是用來(lái)對(duì) Python 進(jìn)行加速的。如果你在使用 Python 編程時(shí),有過(guò)如下想法,那么 Cython 非常適合你。

  1. 因?yàn)槟承┬枨髮?dǎo)致不得不編寫(xiě)一些多重嵌套的循環(huán),而這些循環(huán)如果用 C 語(yǔ)言來(lái)實(shí)現(xiàn)會(huì)快上百倍,但是不熟悉 C 或者不知道 Python 如何與 C 進(jìn)行交互;
  2. 因?yàn)?Python 解釋器的性能原因,如果將 CPython 解釋器換成 PyPy,或者干脆換一門語(yǔ)言,比如 Rust,將會(huì)得到明顯的性能提升,可是換不得。因?yàn)槟愕捻?xiàng)目組規(guī)定只能使用 Python 語(yǔ)言,解釋器只能是 CPython;
  3. Python 是一門動(dòng)態(tài)語(yǔ)言,但你希望至少在數(shù)字計(jì)算方面,能夠加入可選的靜態(tài)類型,這樣可以極大地加速運(yùn)算效果。因?yàn)閱渭兊臄?shù)字相加不太需要所謂的動(dòng)態(tài)性,尤其是當(dāng)你的程序中出現(xiàn)了大量的計(jì)算邏輯時(shí);
  4. 對(duì)于一些計(jì)算密集型的部分,你希望能夠?qū)懗鲆恍╂敲?Numpy, Scipy, Pandas 的算法;
  5. 你有一些已經(jīng)用 C、C++ 實(shí)現(xiàn)的庫(kù),你想直接在 Python 內(nèi)部更好地調(diào)用它們,并且不使用 ctypes、cffi 等模塊;
  6. 也許你聽(tīng)說(shuō)過(guò) Python 和 C 可以無(wú)縫結(jié)合,通過(guò) C 來(lái)為 Python 編寫(xiě)擴(kuò)展模塊,將 Python 代碼中性能關(guān)鍵的部分使用 C 進(jìn)行重寫(xiě),來(lái)達(dá)到提升性能的效果。但是這需要你對(duì) Python 解釋器有很深的了解,熟悉底層的 Python/C API,而這是一件非常痛苦的事情;

如果你有過(guò)上面的一些想法,那么證明你的 Python 水平是很優(yōu)秀的,然而這些問(wèn)題總歸是要解決的,于是 Cython 便閃亮登場(chǎng)了。注意:Cython 并不是一個(gè)什么實(shí)驗(yàn)性的項(xiàng)目,它出現(xiàn)的時(shí)間已經(jīng)不短了,并且在生產(chǎn)環(huán)境中久經(jīng)考驗(yàn),我們完全是有理由學(xué)習(xí)它的。

Cython 是什么?

關(guān)于 Cython,我們必須要清楚兩件事:

  1. Cython 是一門編程語(yǔ)言,它將 C 和 C++ 的靜態(tài)類型系統(tǒng)融合在了 Python 身上。Cython 源文件的后綴是 .pyx,它是 Python 的一個(gè)超集,語(yǔ)法是 Python 語(yǔ)法和 C 語(yǔ)法的混血。當(dāng)然我們說(shuō)它是 Python 的一個(gè)超集,因此你寫(xiě)純 Python 代碼也是可以的。
  2. 當(dāng)我們編寫(xiě)完 Cython 代碼時(shí),需要先將 Cython 代碼翻譯成高效的 C 代碼,然后再將 C 代碼編譯成 Python 的擴(kuò)展模塊。

在早期,編寫(xiě) Python 擴(kuò)展都是拿 C 去寫(xiě),但是這對(duì)開(kāi)發(fā)者有兩個(gè)硬性要求:一個(gè)是熟悉 C,另一個(gè)是要熟悉解釋器提供的 C API,這對(duì)開(kāi)發(fā)者是一個(gè)非常大的挑戰(zhàn)。此外,拿 C 編寫(xiě)代碼,開(kāi)發(fā)效率也非常低。而 Cython 的出現(xiàn)則解決了這一點(diǎn),Cython 和 Python 的語(yǔ)法非常相似,我們只需要編寫(xiě) Cython 代碼,然后再由 Cython 編譯器將 Cython 代碼翻譯成 C 代碼即可。所以從這個(gè)角度上說(shuō),拿 C 寫(xiě)擴(kuò)展和拿 Cython 寫(xiě)擴(kuò)展是等價(jià)的。

至于如何將 Cython 代碼翻譯成 C 代碼,則依賴于相應(yīng)的編譯器,這個(gè)編譯器本質(zhì)上就是 Python 的一個(gè)第三方模塊。它就相當(dāng)于是一個(gè)翻譯官,既然用 C 寫(xiě)擴(kuò)展是一件痛苦的事情,那就拿 Cython 去寫(xiě),寫(xiě)完了再幫你翻譯成 C。

因此 Cython 的強(qiáng)大之處就在于它將 Python 和 C 結(jié)合了起來(lái),可以讓你像寫(xiě) Python 代碼一樣的同時(shí)還可以獲得 C 的高效率。所以我們看到 Cython 相當(dāng)于是高級(jí)語(yǔ)言 Python 和低級(jí)語(yǔ)言 C 之間的一個(gè)融合,因此有人也稱 Cython 是 "克里奧爾編程語(yǔ)言"(creole programming language)。

為什么要有 Cython?

Python 和 C 語(yǔ)言大相徑庭,為什么要將它們?nèi)诤显谝黄鹉兀看鸢甘牵阂驗(yàn)檫@兩者并不是對(duì)立的,而是互補(bǔ)的。

Python 是高階語(yǔ)言、動(dòng)態(tài)、易于學(xué)習(xí),并且靈活。但這些優(yōu)秀的特性是需要付出代價(jià)的,因?yàn)?Python 的動(dòng)態(tài)性、以及它是解釋型語(yǔ)言,導(dǎo)致其運(yùn)行效率比靜態(tài)編譯型語(yǔ)言慢了好幾個(gè)數(shù)量級(jí)。

而 C 語(yǔ)言是最古老的靜態(tài)編譯型語(yǔ)言之一,并且至今也被廣泛使用。從時(shí)間來(lái)算的話,其編譯器已有將近半個(gè)世紀(jì)的歷史,在性能上做了足夠的優(yōu)化,因此 C 語(yǔ)言是非常低級(jí)、同時(shí)又非常強(qiáng)大的。然而不同于 Python 的是,C 語(yǔ)言沒(méi)有提供保護(hù)措施(沒(méi)有 GC、容易內(nèi)存泄露),以及使用起來(lái)很不方便。

所以兩個(gè)語(yǔ)言都是主流語(yǔ)言,只是特性不同使得它們被應(yīng)用在了不同的領(lǐng)域。而 Cython 的美麗之處就在于:它將 Python 語(yǔ)言豐富的表達(dá)能力、動(dòng)態(tài)機(jī)制和 C 語(yǔ)言的高性能匯聚在了一起,并且代碼寫(xiě)起來(lái)仍然像寫(xiě) Python 一樣。

注意:除了極少數(shù)的例外,Python 代碼(2.x和3.x版本)已經(jīng)是有效的 Cython 代碼,因?yàn)?Cython 可以看成是 Python 的超集。并且 Cython 在 Python 語(yǔ)言的基礎(chǔ)上添加了一些少量的關(guān)鍵字來(lái)更好地開(kāi)發(fā) C 的類型系統(tǒng),從而允許 Cython 編譯器生成高效的 C 代碼。如果你已經(jīng)知道 Python 并且對(duì) C 或 C++ 有一定的基礎(chǔ)了解,那么你可以直接學(xué)習(xí) Cython,無(wú)需再學(xué)習(xí)其它的接口語(yǔ)言。

另外,我們其實(shí)可以將 Cython 當(dāng)成兩個(gè)身份來(lái)看待:

  1. 如果將 Cython 翻譯成 C,那么可以看成 Cython 的 '陰';
  2. 如果將 Python 作為膠水連接 C 或者 C++,那么可以看成是 Cython 的 '陽(yáng)'。

我們可以從需要高性能的 Python 代碼開(kāi)始,也可以從需要一個(gè)優(yōu)化 Python 接口的 C、C++ 開(kāi)始,而我們這里是為了學(xué)習(xí) Cython,因此顯然是選擇前者。為了加速 Python 代碼,Cython 將使用可選的靜態(tài)類型聲明并通過(guò)算法來(lái)實(shí)現(xiàn)大量的性能提升,尤其是靜態(tài)類型系統(tǒng),這是實(shí)現(xiàn)高性能的關(guān)鍵。

Cython 和 CPython 的區(qū)別?

關(guān)于 Cython,最讓人困惑的就是它和 CPython 之間的關(guān)系,但是需要強(qiáng)調(diào)的是這兩者是完全不同的。

首先 Python 是一門語(yǔ)言,它有自己的語(yǔ)法規(guī)則,我們按照 Python 語(yǔ)言規(guī)定的語(yǔ)法規(guī)則編寫(xiě)的代碼就是 Python 源代碼。但是源代碼只是一個(gè)或多個(gè)普通的文本文件,我們需要使用 Python 語(yǔ)言對(duì)應(yīng)的解釋器來(lái)執(zhí)行它。

而 Python 解釋器也會(huì)按照同樣的語(yǔ)法規(guī)則來(lái)對(duì)我們編寫(xiě)的 Python 源代碼進(jìn)行分詞、語(yǔ)法解析等等,如果我們編寫(xiě)的代碼不符合 Python 的語(yǔ)法規(guī)則,那么會(huì)報(bào)出語(yǔ)法錯(cuò)誤,也就是 SyntaxError。如果符合語(yǔ)法規(guī)范的話,那么會(huì)順利地生成抽象語(yǔ)法樹(shù)(Abstract Syntax Tree,簡(jiǎn)稱 AST),然后將 AST 編譯成指令集合,也就是所謂的字節(jié)碼(bytes code),最后再執(zhí)行字節(jié)碼。

所以 Python 源代碼是需要 Python 解釋器來(lái)操作的,如果我們想做一些事情的話,光寫(xiě)成源代碼是不行的,必須要由 Python 解釋器將我們的代碼解釋成機(jī)器可以識(shí)別的指令進(jìn)行執(zhí)行才可以。而 CPython 正是 Python 語(yǔ)言對(duì)應(yīng)的解釋器,并且它也是官方實(shí)現(xiàn)的標(biāo)準(zhǔn)解釋器,同時(shí)還是使用最廣泛的一種解釋器。基本上我們使用的解釋器都是 CPython,也就是從官網(wǎng)下載、然后安裝之后所得到的。

標(biāo)準(zhǔn)解釋器 CPython 是由 C 語(yǔ)言實(shí)現(xiàn)的,除了 CPython 之外還有 Jython(java實(shí)現(xiàn)的 Python 解釋器)、PyPy(Python 語(yǔ)言實(shí)現(xiàn)的 Python 解釋器)等等??傊O(shè)計(jì)出一門語(yǔ)言,還要有相應(yīng)的解釋器才可以;至于編譯型語(yǔ)言,則是對(duì)應(yīng)的編譯器。

最后重點(diǎn)來(lái)了,我們說(shuō) CPython 解釋器是由 C 實(shí)現(xiàn)的,它給 Python 語(yǔ)言提供了 C 級(jí)別的接口,也就是熟知的 Python/C API。比如:Python 的列表,底層對(duì)應(yīng)的是 PyListObject;字典則對(duì)應(yīng) PyDictObject,等等等等。

所以當(dāng)我們?cè)?Python 中創(chuàng)建一個(gè)列表,那么 CPython 在執(zhí)行的時(shí)候,就會(huì)在底層創(chuàng)建一個(gè) PyListObject。因?yàn)?CPython 是用 C 來(lái)實(shí)現(xiàn)的,最終肯定是將 Python 代碼翻譯成 C 級(jí)別的代碼,然后再變成機(jī)器碼交給 CPU 執(zhí)行。

而 Cython 也是如此,Cython 代碼也要被翻譯成 C 代碼,然后 C 代碼再變成擴(kuò)展(本質(zhì)上也是機(jī)器碼),導(dǎo)入之后直接執(zhí)行,而無(wú)需動(dòng)態(tài)解釋。因此 Cython 是一門語(yǔ)言,它并不是Python 解釋器的另一種實(shí)現(xiàn),它的地位和 CPython 不是等價(jià)的,不過(guò)和 Python 是平級(jí)的。

總結(jié):Cython 是一門語(yǔ)言,可以通過(guò) Cython 源代碼生成高效的 C 代碼,再將 C 代碼編譯成擴(kuò)展模塊,同樣需要 CPython 來(lái)進(jìn)行調(diào)用。

審核編輯:符乾江

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 源代碼
    +關(guān)注

    關(guān)注

    96

    文章

    2953

    瀏覽量

    69657
  • python
    +關(guān)注

    關(guān)注

    57

    文章

    4857

    瀏覽量

    89586
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如果主節(jié)點(diǎn)使用AD2433,從節(jié)點(diǎn)使用AD2428,會(huì)不會(huì)有什么風(fēng)險(xiǎn)點(diǎn)?

    如果主節(jié)點(diǎn)使用AD2433,從節(jié)點(diǎn)使用AD2428,會(huì)不會(huì)有什么風(fēng)險(xiǎn)點(diǎn)?晚上找不到AD2433的數(shù)據(jù)手冊(cè),感謝各位把遇到的問(wèn)題提前預(yù)警一下。 萬(wàn)分感謝!
    發(fā)表于 04-15 07:09

    用AD4003檢測(cè)電壓時(shí),發(fā)現(xiàn)在空載時(shí)會(huì)有2.8V左右的電壓,請(qǐng)問(wèn)這是為什么?

    我在用AD4003檢測(cè)電壓時(shí),發(fā)現(xiàn)在空載時(shí)會(huì)有2.8V左右的電壓,請(qǐng)問(wèn)這是為什么?我知道ADC本身模擬輸入管腳懸空時(shí)會(huì)有一個(gè)浮動(dòng)的電壓,但我這個(gè)電壓是不是有點(diǎn)太大了。我的VDD=1.8V,VIO=3.3V,REF=5V。
    發(fā)表于 04-15 07:04

    DLPA3005工作溫度范圍是0℃以上,在低于0℃工作會(huì)有什么問(wèn)題?

    DLPA3005工作溫度范圍是0℃以上,在低于0℃工作會(huì)有什么問(wèn)題以及怎樣解決低溫工作這個(gè)問(wèn)題呢?
    發(fā)表于 02-19 08:17

    ADS7945兩個(gè)通道之間會(huì)有干擾,為什么?

    各位大俠們,最近使用ADS7945這個(gè)芯片,發(fā)現(xiàn)它的兩個(gè)通道之間會(huì)有干擾,有沒(méi)有遇到同樣問(wèn)題的???求解!在線等待!
    發(fā)表于 02-11 06:23

    為什么ADS1255每次轉(zhuǎn)換的數(shù)據(jù)會(huì)有波動(dòng)?

    給ADS1255提供一穩(wěn)定的直壓(電池供電),為什么每次轉(zhuǎn)換的數(shù)據(jù)會(huì)有波動(dòng)? 是ADS1255自身有偏移,不夠穩(wěn)定。還是有什么其它的原因,我應(yīng)該怎樣解決這一問(wèn)題。
    發(fā)表于 02-05 06:44

    高速AD加上時(shí)鐘后,輸入信號(hào)會(huì)有一個(gè)兩倍于時(shí)鐘信號(hào)的毛刺產(chǎn)生是什么原因

    高速AD加上時(shí)鐘后,輸入信號(hào)會(huì)有一個(gè)兩倍于時(shí)鐘信號(hào)的毛刺產(chǎn)生。請(qǐng)問(wèn)這是什么原因?Other Parts Discussed in Thread: ADS807, OPA656高速
    發(fā)表于 01-20 06:33

    SN65LVDS32輸出端總會(huì)有不確定的數(shù)據(jù)輸出,為什么?

    會(huì)有不確定的數(shù)據(jù)輸出,在datasheet的典型應(yīng)用中,A、B之間連了一個(gè)100歐姆的電阻,那么當(dāng)上電時(shí),VID應(yīng)該就在上述的那個(gè)范圍內(nèi),那么輸出端就會(huì)有不確定的數(shù)據(jù)輸出,當(dāng)輸出接到MCU時(shí),這個(gè)
    發(fā)表于 01-17 08:34

    PCA9306低壓供電端即使不供電,會(huì)有2.5v電壓,是什么原因?

    PCA9306按照參考設(shè)計(jì),低壓供電1.8v,高壓供電3.3v;實(shí)測(cè)發(fā)現(xiàn)高壓供電3.3v后,低壓供電端即使不供電,會(huì)有2.5v電壓,請(qǐng)問(wèn)是什么原因,謝謝!
    發(fā)表于 01-07 07:54

    ADS1292R參考電壓會(huì)有mV級(jí)的波動(dòng),是否對(duì)采集的心電和呼吸值有影響?

    ADS1292R參考電壓(VREFN、VREFP)會(huì)有mV級(jí)的波動(dòng),是否對(duì)采集的心電和呼吸值有影響,有多大的影響? 像下圖的呼吸波形,突然變小了一點(diǎn)點(diǎn)(大概0.1mV),可能是什么原因? 大神們趕快出來(lái)透透氣吧!
    發(fā)表于 01-01 07:08

    如果不按照EVM的線路加TPS2560是否可行? 會(huì)有何影響?

    您好,我們應(yīng)用 TUSB7340 ,四個(gè)USB口都有引出使用,對(duì)應(yīng)的4個(gè)口的PWRON & OVERCUR引腳懸空是否可以? 如果不照 EVM 的線路加 TPS2560 是否可行? 會(huì)有何影響?
    發(fā)表于 12-31 07:53

    ADS8688輸入端懸空為什么會(huì)有2V左右的電壓?

    如標(biāo)題,原理圖按照TI參考文件tidrbb9設(shè)計(jì),輸入端懸空,但是在每個(gè)通道的輸入端測(cè)量,會(huì)有2V左右的電壓,這個(gè)是什么原因?
    發(fā)表于 12-20 15:22

    多個(gè)DAC8760與一個(gè)SPI通信,這樣設(shè)計(jì)會(huì)有什么問(wèn)題沒(méi)有呢?

    我想咨詢一下:MCU只有一路SPI接口,但需要和多個(gè)DAC8760通信。那么可以用多個(gè)GPIO作為CS片選信號(hào),分別選中不同的DAC8760,而MCU的SCKL,MISO,MOSI這三根信號(hào)同時(shí)連接多片DAC8760,進(jìn)行通信,這樣設(shè)計(jì)會(huì)有什么問(wèn)題沒(méi)有呢?
    發(fā)表于 12-13 06:59

    LMH7220在VREF位置處會(huì)有抖動(dòng),為什么?

    LMH7220在VREF位置處會(huì)有抖動(dòng),如下圖Figure27所示,輸出在輸入狀態(tài)未確定的情況下在“0”和“1”之間切換。在測(cè)試1MHz,脈沖寬度分別為40ns和20ns情況下,當(dāng)VREF設(shè)置為
    發(fā)表于 12-12 07:00

    TLL2553進(jìn)行SPI通信時(shí),參考電源的電壓會(huì)有波動(dòng)嗎?

    當(dāng)進(jìn)行電壓采集時(shí),通過(guò)SPI進(jìn)行數(shù)據(jù)讀寫(xiě)時(shí),當(dāng)MOSI輸出時(shí),發(fā)現(xiàn)參考電源REF的電壓有波動(dòng),最大的波動(dòng)峰峰值為110多mV。 參考電源芯片REF3033AIDBZR 輸出電壓為3.3V輸出電流最大值為25mA。 想了解一下,為什么進(jìn)行SPI通信時(shí),參考電源的電壓會(huì)有波動(dòng)?
    發(fā)表于 12-11 06:24

    AFE4900如果4路都作為不同光譜的PPG使用,會(huì)有什么樣的問(wèn)題?

    AFE4900有4路LED和3個(gè)PD,按照規(guī)格書(shū),有1路LED做環(huán)境光采樣使用,我的問(wèn)題是如果4路都作為不同光譜的PPG使用,會(huì)有什么樣的問(wèn)題
    發(fā)表于 12-09 08:11