国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

如果你有過上面的一些想法,那么證明你的 Python 水平是很優(yōu)秀的,然而這些問題總歸是要解決的,于是 Cython 便閃亮登場了。注意: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 是一門編程語言,它將 C 和 C++ 的靜態(tài)類型系統(tǒng)融合在了 Python 身上。Cython 源文件的后綴是 .pyx,它是 Python 的一個(gè)超集,語法是 Python 語法和 C 語法的混血。當(dāng)然我們說它是 Python 的一個(gè)超集,因此你寫純 Python 代碼也是可以的。
  2. 當(dāng)我們編寫完 Cython 代碼時(shí),需要先將 Cython 代碼翻譯成高效的 C 代碼,然后再將 C 代碼編譯成 Python 的擴(kuò)展模塊。

在早期,編寫 Python 擴(kuò)展都是拿 C 去寫,但是這對開發(fā)者有兩個(gè)硬性要求:一個(gè)是熟悉 C,另一個(gè)是要熟悉解釋器提供的 C API,這對開發(fā)者是一個(gè)非常大的挑戰(zhàn)。此外,拿 C 編寫代碼,開發(fā)效率也非常低。而 Cython 的出現(xiàn)則解決了這一點(diǎn),Cython 和 Python 的語法非常相似,我們只需要編寫 Cython 代碼,然后再由 Cython 編譯器將 Cython 代碼翻譯成 C 代碼即可。所以從這個(gè)角度上說,拿 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é)合了起來,可以讓你像寫 Python 代碼一樣的同時(shí)還可以獲得 C 的高效率。所以我們看到 Cython 相當(dāng)于是高級語言 Python 和低級語言 C 之間的一個(gè)融合,因此有人也稱 Cython 是 "克里奧爾編程語言"(creole programming language)。

為什么要有 Cython?

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

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

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

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

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

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

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

我們可以從需要高性能的 Python 代碼開始,也可以從需要一個(gè)優(yōu)化 Python 接口的 C、C++ 開始,而我們這里是為了學(xué)習(xí) Cython,因此顯然是選擇前者。為了加速 Python 代碼,Cython 將使用可選的靜態(tà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 是一門語言,它有自己的語法規(guī)則,我們按照 Python 語言規(guī)定的語法規(guī)則編寫的代碼就是 Python 源代碼。但是源代碼只是一個(gè)或多個(gè)普通的文本文件,我們需要使用 Python 語言對應(yīng)的解釋器來執(zhí)行它。

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

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

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

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

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

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

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

審核編輯:符乾江

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

    關(guān)注

    96

    文章

    2953

    瀏覽量

    70327
  • python
    +關(guān)注

    關(guān)注

    57

    文章

    4876

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    為什么會(huì)有小端字節(jié)序

    答案是,計(jì)算機(jī)電路先處理低位字節(jié),效率比較高,因?yàn)橛?jì)算都是從低位開始的。所以,計(jì)算機(jī)的內(nèi)部處理都是小端字節(jié)序。 但是,人類還是習(xí)慣讀寫大端字節(jié)序。所以,除了計(jì)算機(jī)的內(nèi)部處理,其他的場合幾乎都是大端字節(jié)序,比如網(wǎng)絡(luò)傳輸和文件儲存。 計(jì)算機(jī)處理字節(jié)序的時(shí)候,不知道什么是高位字節(jié),什么是低位字節(jié)。它只知道按順序讀取字節(jié),先讀第一個(gè)字節(jié),再讀第二個(gè)字節(jié)。 如果是大端字節(jié)序,先讀到的就是高位字節(jié),后讀到的就是低位字節(jié)。小端字節(jié)序正好相反。 理解這一點(diǎn),才能理解計(jì)算機(jī)如何處理字節(jié)序。 處理器讀取外部數(shù)據(jù)的時(shí)候,必須知道數(shù)據(jù)的字節(jié)序,將其轉(zhuǎn)成正確的值。然后,就正常使用這個(gè)值,完全不用再考慮字節(jié)序。 即使是向外部設(shè)備寫入數(shù)據(jù),也不用考慮字節(jié)序,正常寫入一個(gè)值即可。外部設(shè)備會(huì)自己處理字節(jié)序的問題。
    發(fā)表于 12-15 06:24

    EXCUSE ME,表層的AC耦合電容和PCB內(nèi)層的高速線會(huì)有串?dāng)_?

    高速先生成員-- 黃剛 這到底是在描述一種什么樣的設(shè)計(jì)場景呢?其實(shí)是我們在高速設(shè)計(jì)中一個(gè)很典型的case。一般來說,芯片到芯片的高速鏈路中間都會(huì)有AC耦合電容,作用說了500多次了,這里就不重復(fù)了哈
    發(fā)表于 12-10 10:00

    為什么會(huì)有TCP/IP協(xié)議?

    在世界上各地,各種各樣的電腦運(yùn)行著各自不同的操作系統(tǒng)為大家服務(wù),這些電腦在表達(dá)同一種信息的時(shí)候所使用的方法是千差萬別。 就好像圣經(jīng)中上帝打亂了各地人的口音,讓他們無法合作一樣。計(jì)算機(jī)使用者意識到,計(jì)算機(jī)只是單兵作戰(zhàn)并不會(huì)發(fā)揮太大的作用。 只有把它們聯(lián)合起來,電腦才會(huì)發(fā)揮出它最大的潛力。于是人們就想方設(shè)法的用電線把電腦連接到了一起。 但是簡單的連到一起是遠(yuǎn)遠(yuǎn)不夠的,就好像語言不同的兩個(gè)人互相見了面,完全不能交流信息。因而他們需要定義一些共通的東西來進(jìn)行交流,TCP/IP就是為此而生。TCP/IP不是一個(gè)協(xié)議,而是一個(gè)協(xié)議族的統(tǒng)稱。 里面包括了IP協(xié)議,IMCP協(xié)議,TCP協(xié)議,以及我們更加熟悉的http、ftp、pop3協(xié)議等等。電腦有了這些,就好像學(xué)會(huì)了外語一樣,就可以和其他的計(jì)算機(jī)終端做自由的交流了。
    發(fā)表于 12-03 06:28

    為什么有些電子產(chǎn)品主板上會(huì)有一顆CR2032紐扣電池?

    鑰匙到電腦主板,從電子秤到血糖儀。它的身影幾乎無處不在。今天,我想和大家聊聊CR2032背后的數(shù)字密碼、電子產(chǎn)品主板上為什么會(huì)有一顆CR2032以及它搭配愛普生的RTC時(shí)鐘芯片是如何使
    的頭像 發(fā)表于 11-20 08:12 ?2411次閱讀
    為什么有些電子產(chǎn)品主板上<b class='flag-5'>會(huì)有</b>一顆CR2032紐扣電池?

    請問e203_exu_csr模塊里同時(shí)讀寫csr寄存器會(huì)不會(huì)有問題?

    模塊里的寄存器是用的sirv_gnrl_dfflr,同時(shí)讀寫的話,讀到的是新寫進(jìn)去的值。csrrw這種指令會(huì)有問題吧 可能csrr csrw這種用法把這個(gè)問題掩蓋了。我沒環(huán)境驗(yàn)證這個(gè)問題,只是自己在做csr寄存器的時(shí)候遇到了這個(gè)問題,所以想問下
    發(fā)表于 11-06 08:12

    KiCad 10 會(huì)有哪些新功能(二)?

    “ ? 明年正式發(fā)布前會(huì)不定期更新 KiCad 10 的新功能,有興趣的小伙伴可以下載 nightly 嘗鮮。? ” ? 后退鍵依次刪除線段 即使不是在布線的狀態(tài)下,后退鍵(backspace)也可以依次刪除線段。 符號編輯器導(dǎo)出/導(dǎo)入引腳 在符號編輯器中,支持導(dǎo)出引腳到 csv,編輯后重新導(dǎo)入。該功能方便在外部工具中快速編輯引腳的信息。 原理圖編輯器支持“分組”功能 統(tǒng)一調(diào)等長線時(shí)的計(jì)算 這項(xiàng)變更主要在底層,用戶通常不易察覺,但它解決了一個(gè)對于進(jìn)行長度調(diào)諧
    的頭像 發(fā)表于 09-24 11:16 ?1345次閱讀
    KiCad 10 <b class='flag-5'>會(huì)有</b>哪些新功能(二)?

    如果使用 SYS_UnlockReg() 解鎖寄存器后沒有重新鎖定系統(tǒng)寄存器,會(huì)有什么問題嗎?

    如果使用 SYS_UnlockReg() 解鎖寄存器后沒有重新鎖定系統(tǒng)寄存器,會(huì)有什么問題嗎?
    發(fā)表于 08-26 06:41

    使用 SYS_UnlockReg() 解鎖寄存器后沒有重新鎖定系統(tǒng)寄存器,會(huì)有什么問題嗎?

    如果使用 SYS_UnlockReg() 解鎖寄存器后沒有重新鎖定系統(tǒng)寄存器,會(huì)有什么問題嗎?
    發(fā)表于 08-21 07:34

    stm8s電源引腳和地引腳串磁珠,對內(nèi)部RC振蕩電路等會(huì)有影響嗎?

    stm8s芯片電源引腳和地引腳串磁珠,對內(nèi)部RC振蕩電路等會(huì)有影響么,程序使用內(nèi)部高速RC?
    發(fā)表于 08-01 06:38

    如果在WL_REG_ON/BT_REG_ON為低時(shí)輸入PCIe REFCLK,會(huì)有什么問題嗎?

    如果在WL_REG_ON/BT_REG_ON為低時(shí)輸入PCIe REFCLK,會(huì)有什么問題嗎? 我想知道當(dāng) VBAT/VDDIO 處于開啟狀態(tài)且 WL_REG_ON/BT_REG_ON 處于低電平時(shí)哪個(gè)電源域處于開啟狀態(tài)。 謝謝。
    發(fā)表于 07-17 07:34

    減速機(jī)過載會(huì)有哪些影響?

    減速機(jī)在機(jī)械傳動(dòng)系統(tǒng)里扮演著至關(guān)重要的角色,它能夠降低轉(zhuǎn)速并提升扭矩。
    的頭像 發(fā)表于 07-10 17:56 ?667次閱讀
    減速機(jī)過載<b class='flag-5'>會(huì)有</b>哪些影響?

    如果主節(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ù)手冊,感謝各位把遇到的問題提前預(yù)警一下。 萬分感謝!
    發(fā)表于 04-15 07:09

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

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

    AD4817在測試輸出時(shí),發(fā)現(xiàn)輸出會(huì)有負(fù)電壓,是否為Vos影響?

    通過PHOTODIODE工具選定AD4817用于前端光電信號的I/V轉(zhuǎn)換,前端I/V信號為脈沖信號,±5V電源供電, 1:在測試輸出時(shí),發(fā)現(xiàn)輸出會(huì)有負(fù)電壓,是否為Vos影響? 2:如果用單電源供電
    發(fā)表于 03-25 07:47

    使用stm32f405做6步pwm輸出時(shí),定時(shí)器配置由強(qiáng)制輸出轉(zhuǎn)為pwm,com觸發(fā)后會(huì)有延遲生效的現(xiàn)象,怎么解決?

    我在使用stm32f405做6步pwm輸出時(shí)發(fā)現(xiàn),定時(shí)器的配置由pwm改為強(qiáng)制輸出后會(huì)在com觸發(fā)時(shí)立即生效,但是定時(shí)器配置由強(qiáng)制輸出轉(zhuǎn)為pwm,com觸發(fā)后會(huì)有延遲生效的現(xiàn)象。請問有遇到這種問題的嗎? 圖片中所示,在同一時(shí)刻改變兩個(gè)通道的配置,但是CH2N的生效時(shí)間延遲了
    發(fā)表于 03-13 07:24