讓 Python 擁有 C/C++ 一樣的速度,編譯神器 Codon 發布!

csdn 發佈 2024-03-29T13:51:09.337226+00:00

編譯 | 蘇宓出品 | CSDN(ID:CSDNnews)Python 的運行速度快嗎?雖說不同場景不同定論,但整體而言,它沒有 C、Java 快。這也導致 Python 憑藉可讀性、簡單易上手、良好的生態系統橫行 AI 領域時,一提到速度,就成為眾多開發者頭疼的問題。

編譯 | 蘇宓

出品 | CSDN(ID:CSDNnews)

Python 的運行速度快嗎?雖說不同場景不同定論,但整體而言,它沒有 C、Java 快。這也導致 python 憑藉可讀性、簡單易上手、良好的生態系統橫行 AI 領域時,一提到速度,就成為眾多開發者頭疼的問題。

為了解決這一難題,麻省理工學院的計算機科學家出手了,他們共同研發了一種名為 Codon 的 Python 編譯器,可以將 Python 代碼轉化為本地機器代碼,而不會對運行時的性能產生影響。

當前,Codon 已經在 GitHub 上開源:https://github.com/exaloop/codon,斬獲 6300 個 Star。

Codon 與 C/C++ 性能相當

"在單線程上,比 Python 的典型速度提高了 10-100 倍或更多,"Codon repo寫道,"Codon 的性能通常與 C/C++ 的性能相當(有時甚至更好)。"

與 Python 不同的是,Codon 支持本地多線程,這可以使速度提高許多倍。

Codon 最初是作為一個在 Python 中創建高性能特定領域語言(DSL,domain-specific language)的框架而開發的。DSL 是專注於特定目的的語言,而不是像 Python 或 C 這樣的通用程式語言。

據官方 GitHub repo 透露,Codon 源於 Seq 項目,後者是一個用於生物信息學和遺傳學的 DSL,現如今它已經成長為一個與 Python 3 基本兼容的語言編譯器。

近期,外媒 The Register 通過該工具的研究團隊內部最新分享了一個關於 Codon 的論文。本論文的作者包含了,MIT、維多利亞大學等多名研究人員,如 Ariya Shajii(Exaloop)、Gabriel Ramirez(MIT CSAIL)、Haris Smajlović(加拿大維多利亞大學)、Jessica Ray(MIT CSAIL)、Bonnie Berger(MIT CSAIL)、Saman Amarasinghe(MIT CSAIL)和 Ibrahim Numanagić(維多利亞大學)。

這篇論文指出,"與其他面向性能的 Python 實現(如 PyPy 或 Numba)不同,Codon 是作為一個獨立的系統從頭開始構建的,它可以提前編譯為靜態可執行文件,並且不與現有的 Python 運行時(如 CPython 或 RPython)綁定執行。因此,Codon 可以實現更好的性能,並克服運行時的特定問題,如全局解釋器鎖"。

在論文中,作者也討論了各種基於 Codon 的高性能 DSL,這些 DSL 設計用於生物信息學、數據壓縮和並行編程,也利用了 Codon 的編譯器基礎設施。但是 Codon 可以大幅加速標準的 Python 程序,儘管那些依賴外部庫(如 Django 或 DocUtils)的程序必須依賴 CPython 橋接,這就限制了 CPython 的性能。

"Codon 不需要使用像 numpy 這樣的 C 語言實現的庫來重寫程序,也不需要完全用 C 語言重寫,而是可以使用相同的 Python 實現,並給出你用 C 語言重寫的相同性能",麻省理工學院教授和 CSAIL 首席研究員 Saman Amarasinghe說 道,"因此,我相信 Codon 是成功的 Python 應用程式的最簡單的前進道路,這些應用程式由於缺乏性能而達到了一個極限。"

測試

那麼 Codon 是否真的如說的那樣快?在 Codon 論壇上,一位開發者進行了測試:

$ cat fib.py 
def fib(n): if n == 0: return 0 elif n == 1: return 1 else: return fib(n-1) + fib(n-2)
if __name__ == "__main__": import sys print(fib(int(sys.argv[1])))

CPython 3.11

$ python fib.py 40102334155# mem: 8'816_KB# time: 18.42_s

PyPy 7.3.9

$ pypy fib.py 40102334155# mem: 74'596_kB# time: 4.99_s# ~= 3.7x
Codon compiled
$ codon build -release fib.py$ ./fib 40102334155# mem: 5'612_kB# time: 0.26_s# ~= 70.8x

Codon with python interpreter

# in fibpy.py, we just add `@python` decorator to fib function$ codon build -release fibpy.pyexport CODON_PYTHON=/path/to/libpython3.11.so$ ./fibpy 40102334155# mem: 12'828# time: 18.49# ~= 1x

最終發現,一個簡單的 Codon 編譯的斐波那契腳本比 CPython 版本快 70 多倍。

除此之外,該研究團隊也在 GitHub 上貼出了 Codon 基準測試套件的結果,比較了 Python、PyPy、C++ 和 Codon 在一系列任務和應用上的表現。該基準測試是在以下設置上運行的:

最終結果如下所示:

據 Codon 官方文檔顯示,雖然 Codon 的語法和語義與 Python 的幾乎相同,但還是有一些值得一提的區別,如數據類型方面:

  • 整數。Codon 的 int 是一個 64 位有符號的整數,而 Python 的(在版本 3 之後)可以是任意大的。然而 Codon 通過 Int[N] 支持更大的整數,其中 N 是位寬。

  • 字符串。Codon 目前使用 ASCII 字符串,與 Python 的 unicode 字符串不同。

  • 字典。Codon 的字典類型不保留插入順序,與 Python 3.6 的不同。

此外,Codon 和 Python 在類型檢查、數值運算、模塊等維度還有些許的不同,更詳細的內容可參考:https://docs.exaloop.io/codon/general/differences據悉,Codon 已經被商業化地應用在金融和生物信息學、深度學習等領域。

參考來源:

https://www.theregister.com/2023/03/11/python_codon_compiler/

GitHub 地址:https://github.com/exaloop/codon

關鍵字: