一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

  1. 因?yàn)槟承┬枨髮?dǎo)致不得不編寫一些多重嵌套的循環(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. 也許你聽說(shuō)過(guò) Python 和 C 可以無(wú)縫結(jié)合,通過(guò) C 來(lái)為 Python 編寫擴(kuò)展模塊,將 Python 代碼中性能關(guān)鍵的部分使用 C 進(jìn)行重寫,來(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è)超集,因此你寫純 Python 代碼也是可以的。
  2. 當(dāng)我們編寫完 Cython 代碼時(shí),需要先將 Cython 代碼翻譯成高效的 C 代碼,然后再將 C 代碼編譯成 Python 的擴(kuò)展模塊。

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

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

因此 Cython 的強(qiáng)大之處就在于它將 Python 和 C 結(jié)合了起來(lái),可以讓你像寫 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ǔ)言的高性能匯聚在了一起,并且代碼寫起來(lái)仍然像寫 Python 一樣。

注意:除了極少數(shù)的例外,Python 代碼(2.x和3.x版本)已經(jīng)是有效的 Cython 代碼,因?yàn)?Cython 可以看成是 Python 的超集。并且 Cython 在 Python 語(yǔ)言的基礎(chǔ)上添加了一些少量的關(guān)鍵字來(lá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 代碼開始,也可以從需要一個(gè)優(yōu)化 Python 接口的 C、C++ 開始,而我們這里是為了學(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ī)則編寫的代碼就是 Python 源代碼。但是源代碼只是一個(gè)或多個(gè)普通的文本文件,我們需要使用 Python 語(yǔ)言對(duì)應(yīng)的解釋器來(lái)執(zhí)行它。

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

所以 Python 源代碼是需要 Python 解釋器來(lái)操作的,如果我們想做一些事情的話,光寫成源代碼是不行的,必須要由 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)容及配圖由入駐作者撰寫或者入駐合作網(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

    瀏覽量

    68409
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4827

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    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

    為什么MOS管內(nèi)會(huì)有體二極管,它是怎么來(lái)的有什么作用

    前段時(shí)間有兄弟問(wèn),為什么MOS管內(nèi)會(huì)有體二極管,它是怎么來(lái)的?又有什么作用?是不是所有的MOS管都有體二極管? 相信大多數(shù)人都會(huì)有這個(gè)疑問(wèn),網(wǎng)上也有很多資料。王工結(jié)合工作中常用的一些MOS管
    的頭像 發(fā)表于 12-05 11:17 ?5612次閱讀
    為什么MOS管內(nèi)<b class='flag-5'>會(huì)有</b>體二極管,它是怎么來(lái)的有什么作用

    ADS8342減小檢測(cè)通道的輸入電容會(huì)有什么問(wèn)題嗎?

    減小檢測(cè)通道的輸入電容會(huì)有什么問(wèn)題么
    發(fā)表于 11-20 06:45

    干貨!基于RK3568的 AI 人工智能環(huán)境搭建步驟

    cmake -i https://pypi.tuna.tsinghua.edu.cn/simple pip install Cython -i https
    發(fā)表于 11-12 09:43

    一文看懂貼片電感外殼壞了會(huì)有影響嗎

    一文看懂貼片電感外殼壞了會(huì)有影響嗎 gujing 編輯:谷景電子 貼片電感是最近比較火的一種電感元件,特別是在一些精密度要求很高的電子產(chǎn)品中,貼片電感相較于其他電感產(chǎn)品會(huì)更具優(yōu)勢(shì)。貼片電感的外殼對(duì)于
    的頭像 發(fā)表于 10-28 17:24 ?728次閱讀

    求助,關(guān)于PFFB的設(shè)計(jì)問(wèn)題,這樣的設(shè)計(jì)會(huì)有什么好處和壞處?

    請(qǐng)教一下關(guān)于PFFB的設(shè)計(jì)問(wèn)題,這樣的設(shè)計(jì)會(huì)有什么好處和壞處?煩請(qǐng)解答謝謝
    發(fā)表于 10-16 06:52

    電感線圈線徑變粗對(duì)性能會(huì)有怎么樣的影響

    電子發(fā)燒友網(wǎng)站提供《電感線圈線徑變粗對(duì)性能會(huì)有怎么樣的影響.docx》資料免費(fèi)下載
    發(fā)表于 09-30 11:26 ?0次下載

    使用DRV632時(shí)仍然會(huì)有爆破音,為什么?

    在使用音頻運(yùn)放DRV632時(shí)仍然會(huì)有爆破音問(wèn)題,請(qǐng)問(wèn)這個(gè)popfree功能該如何使用?
    發(fā)表于 09-26 08:16

    TLC2274可以用在單電源嗎?會(huì)有影響嗎?

    TLC2274 DATASHEET標(biāo)示是雙電源可以用在單電源會(huì)有影響嗎 2:再閱讀DATASHEET 要看哪個(gè)指標(biāo) 如何判斷是否可用在單電源
    發(fā)表于 09-19 06:28

    請(qǐng)問(wèn)OPA348工作在5.6V會(huì)有問(wèn)題嗎?

    請(qǐng)問(wèn)OPA348工作在5.6V會(huì)有問(wèn)題嗎? DATASHEET 上SUPPLY VOLTAGE是2.2~5.5MAXIMUM RATING 是7.5V。 謝謝
    發(fā)表于 09-18 06:18

    TPA6112 OPAMP聲音輸出會(huì)有雜音的原因?

    前測(cè)到 OPAMP TPA6112 有一個(gè) BUG 就是: 當(dāng)shutdown (High---》Low) 時(shí), OPAMP聲音輸出會(huì)有雜音。 而且似乎 OPAMP 6112 會(huì)去控制輸出 (VO1
    發(fā)表于 08-16 06:30

    INA188為何會(huì)有壓降的情況產(chǎn)生 ?

    我目前使用感測(cè)器的 0~5V 輸出連接到 INA188 的輸入端時(shí)會(huì)有 15mV 的壓降,即全幅輸出 5.000V 會(huì)變成 4.985V,在不接 INA188 時(shí)直接測(cè)量則無(wú) 15mV 的壓降,RG 為 50K 0.1% (放大2倍,使用正負(fù)12V雙電源),請(qǐng)問(wèn)為何會(huì)有
    發(fā)表于 08-14 07:22

    TMP6131QDECRQ1極性貼反會(huì)有什么影響?還能正常使用嗎?

    幫忙確認(rèn)一下如果TMP6131QDECRQ1極性貼反會(huì)有什么影響?還能正常使用嗎?
    發(fā)表于 08-07 07:35

    你知道共模電感用錯(cuò)了會(huì)有什么影響嗎

    電子發(fā)燒友網(wǎng)站提供《你知道共模電感用錯(cuò)了會(huì)有什么影響嗎.docx》資料免費(fèi)下載
    發(fā)表于 07-30 10:42 ?0次下載