色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Cython是什么,為什么會有Cython

python爬蟲知識分享 ? 來源:python爬蟲知識分享 ? 作者:python爬蟲知識分享 ? 2022-06-16 16:11 ? 次閱讀

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

  1. 因為某些需求導致不得不編寫一些多重嵌套的循環,而這些循環如果用 C 語言來實現會快上百倍,但是不熟悉 C 或者不知道 Python 如何與 C 進行交互;
  2. 因為 Python 解釋器的性能原因,如果將 CPython 解釋器換成 PyPy,或者干脆換一門語言,比如 Rust,將會得到明顯的性能提升,可是換不得。因為你的項目組規定只能使用 Python 語言,解釋器只能是 CPython;
  3. Python 是一門動態語言,但你希望至少在數字計算方面,能夠加入可選的靜態類型,這樣可以極大地加速運算效果。因為單純的數字相加不太需要所謂的動態性,尤其是當你的程序中出現了大量的計算邏輯時;
  4. 對于一些計算密集型的部分,你希望能夠寫出一些媲美 Numpy, Scipy, Pandas 的算法
  5. 你有一些已經用 C、C++ 實現的庫,你想直接在 Python 內部更好地調用它們,并且不使用 ctypes、cffi 等模塊;
  6. 也許你聽說過 Python 和 C 可以無縫結合,通過 C 來為 Python 編寫擴展模塊,將 Python 代碼中性能關鍵的部分使用 C 進行重寫,來達到提升性能的效果。但是這需要你對 Python 解釋器有很深的了解,熟悉底層的 Python/C API,而這是一件非常痛苦的事情;

如果你有過上面的一些想法,那么證明你的 Python 水平是很優秀的,然而這些問題總歸是要解決的,于是 Cython 便閃亮登場了。注意:Cython 并不是一個什么實驗性的項目,它出現的時間已經不短了,并且在生產環境中久經考驗,我們完全是有理由學習它的。

Cython 是什么?

關于 Cython,我們必須要清楚兩件事:

  1. Cython 是一門編程語言,它將 C 和 C++ 的靜態類型系統融合在了 Python 身上。Cython 源文件的后綴是 .pyx,它是 Python 的一個超集,語法是 Python 語法和 C 語法的混血。當然我們說它是 Python 的一個超集,因此你寫純 Python 代碼也是可以的。
  2. 當我們編寫完 Cython 代碼時,需要先將 Cython 代碼翻譯成高效的 C 代碼,然后再將 C 代碼編譯成 Python 的擴展模塊。

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

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

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

為什么要有 Cython?

Python 和 C 語言大相徑庭,為什么要將它們融合在一起呢?答案是:因為這兩者并不是對立的,而是互補的。

Python 是高階語言、動態、易于學習,并且靈活。但這些優秀的特性是需要付出代價的,因為 Python 的動態性、以及它是解釋型語言,導致其運行效率比靜態編譯型語言慢了好幾個數量級。

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

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

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

另外,我們其實可以將 Cython 當成兩個身份來看待:

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

我們可以從需要高性能的 Python 代碼開始,也可以從需要一個優化 Python 接口的 C、C++ 開始,而我們這里是為了學習 Cython,因此顯然是選擇前者。為了加速 Python 代碼,Cython 將使用可選的靜態類型聲明并通過算法來實現大量的性能提升,尤其是靜態類型系統,這是實現高性能的關鍵。

Cython 和 CPython 的區別?

關于 Cython,最讓人困惑的就是它和 CPython 之間的關系,但是需要強調的是這兩者是完全不同的。

首先 Python 是一門語言,它有自己的語法規則,我們按照 Python 語言規定的語法規則編寫的代碼就是 Python 源代碼。但是源代碼只是一個或多個普通的文本文件,我們需要使用 Python 語言對應的解釋器來執行它。

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

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

標準解釋器 CPython 是由 C 語言實現的,除了 CPython 之外還有 Jython(java實現的 Python 解釋器)、PyPy(Python 語言實現的 Python 解釋器)等等。總之設計出一門語言,還要有相應的解釋器才可以;至于編譯型語言,則是對應的編譯器。

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

所以當我們在 Python 中創建一個列表,那么 CPython 在執行的時候,就會在底層創建一個 PyListObject。因為 CPython 是用 C 來實現的,最終肯定是將 Python 代碼翻譯成 C 級別的代碼,然后再變成機器碼交給 CPU 執行。

而 Cython 也是如此,Cython 代碼也要被翻譯成 C 代碼,然后 C 代碼再變成擴展(本質上也是機器碼),導入之后直接執行,而無需動態解釋。因此 Cython 是一門語言,它并不是Python 解釋器的另一種實現,它的地位和 CPython 不是等價的,不過和 Python 是平級的。

總結:Cython 是一門語言,可以通過 Cython 源代碼生成高效的 C 代碼,再將 C 代碼編譯成擴展模塊,同樣需要 CPython 來進行調用。

審核編輯:符乾江

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 源代碼
    +關注

    關注

    96

    文章

    2946

    瀏覽量

    66800
  • python
    +關注

    關注

    56

    文章

    4798

    瀏覽量

    84810
收藏 人收藏

    評論

    相關推薦

    為什么MOS管內會有體二極管,它是怎么來的有什么作用

    前段時間有兄弟問,為什么MOS管內會有體二極管,它是怎么來的?又有什么作用?是不是所有的MOS管都有體二極管? 相信大多數人都會有這個疑問,網上也有很多資料。王工結合工作中常用的一些MOS管
    的頭像 發表于 12-05 11:17 ?1234次閱讀
    為什么MOS管內<b class='flag-5'>會有</b>體二極管,它是怎么來的有什么作用

    ADS8342減小檢測通道的輸入電容會有什么問題嗎?

    減小檢測通道的輸入電容會有什么問題么
    發表于 11-20 06:45

    干貨!基于RK3568的 AI 人工智能環境搭建步驟

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

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

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

    求助,關于PFFB的設計問題,這樣的設計會有什么好處和壞處?

    請教一下關于PFFB的設計問題,這樣的設計會有什么好處和壞處?煩請解答謝謝
    發表于 10-16 06:52

    電感線圈線徑變粗對性能會有怎么樣的影響

    電子發燒友網站提供《電感線圈線徑變粗對性能會有怎么樣的影響.docx》資料免費下載
    發表于 09-30 11:26 ?0次下載

    TPA6112 OPAMP聲音輸出會有雜音的原因?

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

    INA188為何會有壓降的情況產生 ?

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

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

    幫忙確認一下如果TMP6131QDECRQ1極性貼反會有什么影響?還能正常使用嗎?
    發表于 08-07 07:35

    你知道共模電感用錯了會有什么影響嗎

    電子發燒友網站提供《你知道共模電感用錯了會有什么影響嗎.docx》資料免費下載
    發表于 07-30 10:42 ?0次下載

    輸出共模電感為什么會有噪音

    電子發燒友網站提供《輸出共模電感為什么會有噪音.docx》資料免費下載
    發表于 07-04 17:06 ?1次下載

    工字電感在使用中壞了會有什么現象

    電子發燒友網站提供《工字電感在使用中壞了會有什么現象.docx》資料免費下載
    發表于 07-04 16:52 ?1次下載

    WSL2下VSCode插件安裝失敗的原因?

    to to Python \'class private name\' rules. This may change in a future release. Error compiling Cython file
    發表于 06-06 08:07

    電感質量不好會有什么后果

    電子發燒友網站提供《電感質量不好會有什么后果.docx》資料免費下載
    發表于 03-29 14:51 ?0次下載

    放大器器件手冊上為什么會有MAG和MSG這兩個指標呢?

    一個需要外匹配的管子的手冊上,經常會有MAG和MSG這兩個指標。
    的頭像 發表于 03-18 18:21 ?3923次閱讀
    放大器器件手冊上為什么<b class='flag-5'>會有</b>MAG和MSG這兩個指標呢?
    主站蜘蛛池模板: 欧美顶级情欲片免费看| 久久久久久久免费| 99热最新在线| 在线视频网站www色| 亚洲成年人影院| 色淫阁色九九| 肉多荤文高h羞耻校园| 欧洲最强rapper潮水喷视频| 欧美18videosex| 牛牛在线国产精品| 男人插女人动态| 男女啪啪抽搐呻吟高潮动态图| 久久免费资源福利资源站| 久草大| 久久久久久久久久久福利观看| 精品视频在线观看视频免费视频| 国产亚洲精品久久77777| 国产精品亚洲AV毛片一区二区三区 | 国精一区二区AV在线观看网站| 国产午夜精品久久久久婷婷 | 甜性涩爱免费下载| 天天噜日日噜夜夜噜| 午夜福利免费0948视频| 亚洲成人一区二区| 亚洲七七久久桃花综合| 尤物99久久久合集一区区| 中国xxxxx69| 97免费视频在线观看| 拔擦拔擦8X永久华人免费播放器 | 久久视热频国产这里只有精品23| 伦 乱真实故事| 欧美gay老头互吃| 日日噜噜大屁股熟妇| 午夜A级理论片左线播放| 亚洲欧美日韩国产手机在线| 影音先锋av男人资源| 99re久久这里只有精品| vivoe另类| 国产美女视频一区二区二三区 | 欧美嫩freexxxhddvd| 色噜噜2017最新综合|