噂の「Python, JITコンパイラサポートするってよ」を試してみる

2024.05.24

はじめに

※これはまだ正式リリース前の情報です。ここに書いたことが嘘になる可能性がありますのであらかじめご了承ください。

ちょっと前になんか見てるとき、PythonがJITに対応するって目にしました。 僕は普段PypyではなくCPythonを使っているので、実現すると嬉しいなぁと思いつつ今日まで過ごしてきました。

そんな中、たまたまpython JITとかでググるとこんな記事を見つけたわけです。

ここにはCPythonで採用する予定のJIT方式の概要が書かれているわけですが、1行目に

CPython core developer Brandt Bucher submitted a little pull-request to the Python 3.13 branch adding a JIT compiler.

PRが作られている...!

ということで早速Python3.13をインストールして遊んでみます。

使っているOSはmacOS Sonoma 14.5です。

準備

リリースはされていないですが、もちろんtagはあるので3.13から生えている最新(3.13.0b1)のやつを落としてきました。

JITの有効化はビルドオプションらしいので、まずは普通にビルドしてみます。

./configure
make
make test
sudo make install

いつものやつですね。Python3.12をAL2にソースインストールしたときはlibssl周りかなんかで3日くらい溶かした記憶がありますが、これはすんなりいきました。嬉しい。

で、パフォーマンスの検証には適当にバブルソートのコードを用意しました。正直どんなコードがJITの恩恵を受けやすいかとかはわかっていません。

import random


def bubble_sort(target_list: list):
    for i in range(len(target_list) - 1):
        for j in range(len(target_list) - i - 1):
            if target_list[j] > target_list[j + 1]:
                target_list[j], target_list[j + 1] = target_list[j + 1], target_list[j]

    return target_list


test_list = [random.randint(1, 100000000) for _ in range(10000)]
answer = bubble_sort(test_list)
print(answer)

ノーマルのPython3.13 結果

10回実行した平均が2.155[s]でした。昔に比べるとはるかに早くなりましたよね。ちなみにたまたまMacに入ってた3.12だと2.16[s]くらいでした。

JITの有効化

結構時間かかったんですが、終わってみたら難しいことは1つもなかったですね。変わる部分だけ書いておきます。

  • llvmのインストール
brew install llvm@18

これはドキュメントに書いてありました。気づかずに無理やりclang-18を入れようとしていて苦しんでいました。(1時間溶かした)

  • ビルドオプションをつける
./configure --enable-experimental-jit --enable-optimizations

optimizationsのオプションも必要です。ドキュメントは見つけ出せなかったけど。これがないとmakeが通りません。(1時間溶かした)

あとは普通にmakeしていけばOKです。多分有効になっています。

JIT有効化したPython3.13 結果

10回の平均が2.002[s]でした。早いですね。6~7%程度の性能向上が見られます。ここの肌感も冒頭の投稿通りです。 ちなみに--enable-optimizationsだけで実行すると平均で2.02[s]でした。最適化もすごく効いてます。

終わりに

本機能はまだまだリリースが先ではありますが、今のうちから楽しみですね。また、冒頭の記事を読む限りだとJava VM的な、リソースたくさん使ってパフォーマンス向上させるモンスターマシン的な実装にはならないっぽい(?)ので棲み分けできて良さそうだなぁと感じています。(モンスターPythonも見てみたい気持ちはありますが。)