Pythonは世界的に広く使われている言語であり、シンプルでわかりやすい文法や豊富なライブラリ、拡張性など、多くの利点があります。しかし、その一方で、Pythonの実行速度に課題があるという指摘は皆さんも一度は耳にしたことがあるかと思います。
この課題を解決すべく、MITの研究者らが開発した「Codon」について紹介したいと思います。Codonは、ランタイムのオーバーヘッドなしで Pythonのコードをネイティブなマシン語にコンパイルする高性能なPythonコンパイラです。Codonを使うとシングルスレッドでも十分な高速化を行うことができますが、マルチスレッドもサポートしているため、更なる高速化も図れます。
インストール方法
OSがLinux (x86_64) か MacOS (x86_64 または arm64) であれば、公式からビルド済みのバイナリが配布されているので、1コマンドでインストールすることができます。
/bin/bash -c "$(curl -fsSL [6](https://exaloop.io/install.sh))"
その他についてはソースからビルドする必要があり、以下の公式のドキュメントを参考にインストールすることができます。
実行方法
以下のように codon run
コマンドで、JIT (Just-In-Time)モードで実行することができます。
# JITモードで実行
codon run foo.py
また、以下のように実行ファイルをビルドして実行することもできます。
# 実行ファイルをビルドして実行
codon build -o foo foo.py
./foo
速度検証
Pythonでは比較的時間のかかる、10 4 個の乱数に対しバブルソート(オーダー O (n 2) )を行うという処理で実行速度を計測したいと思います。
import random
import time
# 10000個の乱数を生成
numbers = [random.randint(0, 10000) for i in range(10000)]
start_time = time.perf_counter()
# バブルソート
for i in range(len(numbers)):
for j in range(len(numbers)-1):
if numbers[j] > numbers[j+1]:
numbers[j], numbers[j+1] = numbers[j+1], numbers[j]
execution_time = time.perf_counter() - start_time
# 結果を表示
print(numbers[:10])
print("time:", execution_time, "[s]")
上記の実行結果は以下の通りでした。
$ python test.py
[0, 5, 5, 7, 7, 8, 8, 8, 10, 12]
time: 9.712872083997354 [s]
それに対し、上記プログラムをCodonを使って実行してみた結果は以下の通りです。
$ codon run test.py
[0, 1, 2, 3, 6, 7, 7, 7, 8, 8]
time: 1.04412 [s]
Codonを使うことで、Pythonの実行速度が約10倍に高速化しました。
Codonと他のツールとの比較
Pythonの実行速度を高速化する処理系やライブラリとして、代表的なものを紹介します。
- PyPy
- Cython
- Numba
- CPython
CodonはPythonの記法をできるだけ損なわず、かつネイティブコードと同等の速度を出すことが可能という特徴があります。
結論
Codonは、Pythonのコードをネイティブなマシン語にコンパイルすることで、Pythonの実行速度を大幅に向上させることができます。これにより、Pythonの便利さを活かしつつ、高速な実行が可能となり、より広範な用途でPythonを使用することが可能となります。.