🐌

【Codon】Pythonコンパイラを試してみた

2022/12/10に公開1

https://news.ycombinator.com/item?id=33908576
Hacker Newsに上がっていたCodonというソフトウェアが気になったので、少し試してみました。

Codonとは?

PythonのコードをマシンコードにコンパイルするPythonコンパイラです。
標準のPythonで使われている処理系(CPython)はインタプリタですが、このプロジェクトではPythonの処理系をコンパイラとして実装することでC/C++と遜色ないほどの速度を実現したとありました。
https://github.com/exaloop/codon
また、このプロジェクトはSeqと呼ばれる計算ゲノム学およびバイオインフォマティクスのためのプログラミング言語の後継のようで、Seqの構文はPythonと互換性があったようです。
https://github.com/seq-lang/seq

インストール方法

/bin/bash -c "$(curl -fsSL https://exaloop.io/install.sh)"

実行

ライプニッツの公式で円周率を求めるプログラムを作ってみました。

import sys

MAX_ITERATIONS = 1000000

pi = 0

for i in range(MAX_ITERATIONS):
  pi += (-1) ** i / (2 * i + 1)

print(pi * 4)

通常のPythonのインタプリタでは正しく実行されましたが...

❯ python3 leibniz.py
3.1415916535897743

codonで実行してみると、エラーが出てしまいました。
どうやらint型を入れるべきところにfloat型を入れていると言っているようです。

❯ codon run leibniz.py
leibniz.py:8:3-32: error: 'float' does not match expected type 'int'

pi = 0pi = 0.0に変更したところ

❯ codon run leibniz.py
3.14159

うまくいきました。
Pythonのコンパイラとは言っていますが、そのまんまPythonが使えるというわけでもないようです。

速さの比較

❯ hyperfine "python3 leibniz.py" "codon run leibniz.py"
Benchmark 1: python3 leibniz.py
  Time (mean ± σ):     323.1 ms ±   5.9 ms    [User: 318.4 ms, System: 3.2 ms]
  Range (min … max):   318.4 ms … 338.2 ms    10 runs

Benchmark 2: codon run leibniz.py
  Time (mean ± σ):     686.1 ms ±   4.7 ms    [User: 653.4 ms, System: 30.1 ms]
  Range (min … max):   676.6 ms … 692.0 ms    10 runs

Summary
  'python3 leibniz.py' ran
    2.12 ± 0.04 times faster than 'codon run leibniz.py'

Python3の方が早くなってしまいました...が、ここで使ったのはcodonのrunコマンドです。
これはJITモードで実行されるので、今度はbuildコマンドを使って事前コンパイルをしましょう。

コンパイル

❯ codon build leibniz.py
❯ ./leibniz
3.14159

うまくコンパイルできたようなので速度を比較します。

❯ hyperfine "python3 leibniz.py" ./leibniz
Benchmark 1: python3 leibniz.py
  Time (mean ± σ):     327.9 ms ±   6.2 ms    [User: 320.8 ms, System: 3.7 ms]
  Range (min … max):   322.1 ms … 343.1 ms    10 runs

Benchmark 2: ./leibniz
  Time (mean ± σ):      54.0 ms ±   0.8 ms    [User: 52.5 ms, System: 0.9 ms]
  Range (min … max):    52.6 ms …  56.8 ms    52 runs

Summary
  './leibniz' ran
    6.07 ± 0.15 times faster than 'python3 leibniz.py'

6倍早くなっていますね!
このようにCodonを使うことで、Pythonで書かれたコードでも遅いとは言わせないプログラムを作ることができます!

ただ、注意点として先ほども述べましたが、そのままPythonが使えるというわけではありません。これはCodonが静的な型チェックを事前に行うことによります。このことについては、Hacker Newsでも言及されていました。

これができないとなると、Pythonとはかなり違う言語のような気がします。
This seems like a very different language from Python if it won't let you do:

[1, 'a string']

感想

私は主に書き捨てプログラムを際にPythonを使うので、あまり出番は無いかと思いましたが、需要もなくはなさそうです。
Hacker Newsでは、「CodonはPythonではなく、Python風だ!」といった議論が巻き起こっておりPythonという言語の特徴についての意見が多く興味深かったです。印象としては、みんなPythonの動的な感じが好きなのかな..?と思いました。

Discussion

kazappskazapps

--releaseでリリースモードにしないといけないのでは?