商品等のご購入はAmazonがおすすめ

Pythonを何倍も高速にする「codon」を使ってみた

プログラミング

ネットニュースに挙がっていたので、codonというPython用コンパイラを試してみました。

インストール

Windows

Windowsでやろうと思ったんですが本記事作成時点ではソースコードからビルドすることになります。

途中まではうまくいきましたがmingwのar.exeがうまく動作せず諦めました。

Linux

WSLDebianで行いました。

Linux version info

私はFish Shellを使用しているので、やや無駄な処理を挟んでいます。

Bashをお使いの方はたぶんインストールするだけで使用できますたぶん。

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

Fishの場合は

curl -fsSL https://exaloop.io/install.sh | bash
echo "set PATH ~/.codon/bin \$PATH" >> ~/.config/fish/config.fish
source ~/.config/fish/config.fish

こんな感じで自分でPathを通したりする必要があるようです。

コンパイル

codon build -release -exe example.py

これで「example」という実行ファイルが作成されます。

実行速度

比較用プログラム

素数カウンターを用いて比較してみようと思います。

整数100000以内の素数の数を数えます。

import sys

def is_prime(n):
    if n < 2:
        return False
    for i in range(2, n):
        if n % i == 0:
            return False
    return True

def main():
    limit = int(sys.argv[1])
    total = 0

    # @par(schedule='dynamic', chunk_size=100, num_threads=16)
    for i in range(2, limit+1):
        if is_prime(i):
            total += 1

    print(total)

if __name__ == "__main__":
    main()

15行目のparデコレータはcodonにおいてOpenMPというマルチスレッディングを使用するためのものです。

マルチスレッディング化するさいにはコメントアウトを外します。

結果

上記したPythonとそれをcodonでコンパイルしたものとさらにそれをマルチスレッド化したもの、ついでに比較用にGO言語による実行速度は以下のようになりました。

実行速度(ミリ秒)
Python14320
codon2540
codon(マルチスレッド)274
GO3032

ちょっと信じられないくらい速かったです。

外部ライブラリの使用方法

これが思った以上に面倒でした。

公式サイトには「CODON_PYTHON環境変数にlibpython.X.Y.so設定しろ」って書いてあるんですが、普通にインストールしたPythonには存在しませんでした。

AnacondaPyenvなどからインストールしたPythonには存在するので、使うならそっちを使えってことなんだと思います。

使う気失せる・・・

環境変数の設定

とりあえずPyenvで設定したのでその前提で。

/home/<user>/.pyenv/versions/3.11.2/lib/libpython3.11.so

このような名前のダイナミックライブラリへのシンボリックリンクファイルが存在するので、

export CODON_PYTHON=/home/<user>/.pyenv/versions/3.11.2/lib/libpython3.11.so
set -Ux CODON_PYTHON /home/debi/.pyenv/versions/3.11.2/lib/libpython3.11.so

などとして設定してください。

ソースコード

上記の設定さえ終えればあとは簡単です。

使用したいライブラリをpipでインストールし、以下のように

@python
def myrange(n: int) -> List[int]:
    from numpy import arange
    return list(arange(n))

print(myrange(5))

pythonデコレータをつければ、その関数はPythonとして動作します。

備考

一般的にPythonは処理速度が遅いと言われがちですが、これは一部誤りです。

バックエンドと呼ばれるサーバー処理や、AIなどのGPUを利用する処理などにはそれなりに優れています。

要は使い方次第です。

まとめ

記事にしておいて言うのもなんですが、今のところは使い道はなさそうというのが所感です。

とは言えメジャーバージョンではないので今後に期待です。

コメント

タイトルとURLをコピーしました