狂攬兩千星,速度百倍提升,高性能Python編譯器Codon開源
眾所周知,Python 是一門簡單易學、具有強大功能的編程語言,在各種用戶使用統(tǒng)計榜單中總是名列前茅。相應(yīng)地,圍繞 Python,研究者開發(fā)了各種便捷工具,以更好的服務(wù)于這門語言。
編譯器充當著高級語言與機器之間的翻譯官,不同版本的 Python 編譯器已被開發(fā)出來,下面我們將為大家介紹一款新的高性能 Python 編譯器:Codon。該項目上線短短幾天,已收獲 2.2k 星。
項目地址:https://github.com/exaloop/codon
作為高性能 Python 編譯器,Codon 可將 Python 代碼編譯為本機機器代碼,而無需任何運行時開銷。在單線程上,Python 的典型加速大約為 10-100 倍或更多。Codon 的性能通常與 C/C++ 的性能相當。與 Python 不同,Codon 支持本機多線程,這可以使速度提高很多倍。Codon 可通過插件基礎(chǔ)結(jié)構(gòu)進行擴展,它允許用戶合并新的庫、編譯器優(yōu)化甚至關(guān)鍵字。
Codon 框架是完全模塊化和可擴展的,允許無縫集成新模塊、編譯器優(yōu)化、領(lǐng)域特定語言等,并積極為生物信息學和量化金融等多個領(lǐng)域開發(fā)新的 Codon 擴展。
Codon Pipeline
這個一經(jīng)發(fā)布就瘋狂攬星的編譯器效果如何呢?下面我們來看看一些基準測試結(jié)果。
基準測試
以下是來自 Codon 基準測試套件的結(jié)果,比較了 Python、PyPy、C++ 和 Codon 在一系列任務(wù)和應(yīng)用程序上的表現(xiàn)。
基準測試在以下設(shè)置上運行:
Python、PyPy、Codon 的對比
Python、PyPy、C++ 、Codon 的對比
?
幾種語言的具體對比如下:
Codon 盡可能地遵循 CPython 語法、語義和 API,但在一些特殊情況下,考慮性能原因,Codon 與 CPython 會有些不同,例如 Codon 為 64 位 int,CPython 是任意寬度 int。在性能方面,CPython 的加速通常是 10-100 倍的加速。
雖然 Codon 確實提供了一個類似于 Numba 的 JIT 裝飾器,但 Codon 通常是一個提前(ahead-of-time)編譯器,可以將端到端程序編譯為本機代碼。它還支持編譯更廣泛的 Python 構(gòu)造和庫集。
PyPy 的目標是成為 CPython 的簡易替代品,而 Codon 在一些地方有所不同,這些不同主要體現(xiàn)在消除動態(tài)運行時或虛擬機上,從而獲得更好的性能。
Codon 通常生成與等效的 C 或 C++ 程序相同的代碼,有時可以生成比 C/C++ 編譯器更好的代碼。原因有很多,例如更好的容器實現(xiàn),Codon 不使用目標文件和內(nèi)聯(lián)所有庫代碼,或者不使用 C 執(zhí)行的特定于 Codon 的編譯器優(yōu)化或 C++。
Codon 的編譯過程實際上更接近 C++ 而不是 Julia。Julia 是一種動態(tài)類型語言,它執(zhí)行類型推斷作為優(yōu)化,而 Codon 類型是提前檢查整個程序。Codon 還試圖通過采用 Python 的語法和語義來規(guī)避新語言的學習曲線。
常見問題解答
雖然 Codon 幾乎支持 Python 的所有語法,但它并不是一個簡單的替代品,大型代碼庫可能需要修改才能通過 Codon 編譯器運行。例如,一些 Python 的模塊還沒有在 Codon 中實現(xiàn),一些 Python 的動態(tài)特性是不允許的。Codon 編譯器會生成詳細的錯誤消息,以幫助識別和解決任何不兼容問題。Codon 支持無縫的 Python 互操作性,以處理需要特定 Python 庫或動態(tài)性的情況。
我想使用 Codon,但我有一個大型 Python 代碼庫且不想移植,怎么辦?
你可以通過 @codon.jit 裝飾器來使用 Codon,這將只編譯帶注釋的函數(shù),并自動處理與 Codon 之間的數(shù)據(jù)轉(zhuǎn)換。它還允許使用任何特定于 Codon 的模塊或擴展,例如多線程。
與其他語言和框架的互通性如何?
互通性是 Codon 的優(yōu)先事項。我們不希望使用 Codon 使用戶無法使用現(xiàn)有的其他優(yōu)秀框架和庫。Codon 支持與 Python 和 C/C++ 的完全互通。
Codon 是否使用垃圾收集?
是的,Codon 使用了 Boehm 垃圾收集器。
Codon 不支持 Python 模塊 X 或函數(shù) Y?
雖然 Codon 涵蓋了 Python 標準庫的一個相當大的子集,但它還沒有涵蓋每個模塊的每個函數(shù)。請注意,仍然可以通過 Python 調(diào)用缺少的函數(shù) from python import。許多缺少 Codon 本地實現(xiàn)的函數(shù)(例如 I/O 或 OS 相關(guān)功能)通常不會實現(xiàn) Codon 的實質(zhì)性加速。
對于我的應(yīng)用程序,Codon 并不比 Python 快?
大部分時間用在 C 語言實現(xiàn)的庫代碼中的應(yīng)用程序通常不會在 Codon 中看到實質(zhì)性的性能提升。同樣地,受 I/O 或網(wǎng)絡(luò)限制的應(yīng)用程序在 Codon 中也會遇到相同的瓶頸。
對于我的應(yīng)用程序,Codon 比 Python 慢?
如果是這樣,請將 Codon 明顯比 Python 慢的情況報告給問題跟蹤器。
Codon 是免費的嗎?
對于非生產(chǎn)用途,Codon 始終是免費的。用戶可以免費將 Codon 用于個人、學術(shù)或其他非商業(yè)應(yīng)用。
Codon 是開源的嗎?
Codon 是根據(jù)商業(yè)源代碼許可證 (BSL) 獲得許可的,它的源代碼是公開可用的,并且可以免費用于非生產(chǎn)用途。BSL 在技術(shù)上不是「開源」許可證,盡管在許多情況下你仍然可以像對待任何其他開源項目一樣對待 Codon。重要的是,根據(jù) BSL,每個版本的 Codon 都會在 3 年后轉(zhuǎn)換到實際的開源許可證(特別是 Apache)。