編譯 | 蘇宓
出品 | 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 40
102334155
# mem: 8'816_KB
# time: 18.42_s
PyPy 7.3.9
$ pypy fib.py 40
102334155
# mem: 74'596_kB
# time: 4.99_s
# ~= 3.7x
Codon compiled
$ codon build -release fib.py
$ ./fib 40
102334155
# 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.py
export CODON_PYTHON=/path/to/libpython3.11.so
$ ./fibpy 40
102334155
# 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