【Codon】Pythonコンパイラを試してみた
Hacker Newsに上がっていたCodonというソフトウェアが気になったので、少し試してみました。
Codonとは?
PythonのコードをマシンコードにコンパイルするPythonコンパイラです。
標準のPythonで使われている処理系(CPython)はインタプリタですが、このプロジェクトではPythonの処理系をコンパイラとして実装することでC/C++と遜色ないほどの速度を実現したとありました。
また、このプロジェクトはSeqと呼ばれる計算ゲノム学およびバイオインフォマティクスのためのプログラミング言語の後継のようで、Seqの構文はPythonと互換性があったようです。
インストール方法
/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 = 0
をpi = 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
--releaseでリリースモードにしないといけないのでは?