🕒

Python 3.13の試験的新機能「JIT」を試してみた

2024/11/08に公開

はじめに

CPythonでついにJITが使えるようになりそうです。
バージョン3.13から試験的に導入されました。
頻繁に実行されるコード片を機械語にコンパイルすることで、実行速度の向上が期待されます。

https://github.com/python/cpython

環境

  • OS: Windows 11 Home
  • CPU: AMD Ryzen 5 3500
  • Memory: 32GB

CPythonのビルド

JITを有効化するため、CPythonをソースコードからビルドします。
ここではWindows向けにビルドします。

必要なもの

まず、MSBuildが必要です。
Visual StudioをインストールすればMSBuildもインストールされますが、ここではあえてVisual Studioを使わない手順を取ります。

Build Tools for Visual Studioをインストールすることにより、Developer Command PromptでMSBuildが使えるようになります。
私はBuild Tools for Visual Studio 2022をインストールしました。

さらにVisual Studio InstallerからVS C++ ビルドツールとWindows SDKを追加します。
私はWindows 11 SDK (10.0.26100.0)MSVC v143 - VS 2022 C++ x64/x86 ビルドツールを追加しました。

ここまでのもので通常のビルドはできますが、JITを有効化するにはさらにLLVMが必要です。
私はScoopllvm 19.1.3をインストールしました。

バージョン18ではないLLVMを使う場合、Tools/jit/_llvm.py_LLVM_VERSIONを18からそのバージョンに変更する必要があります。

ビルドの実行

PCbuild/build.bat --experimental-jitを実行するだけです。
amd64というディレクトリが作成され、その中に実行ファイルが生成されました。

計測

--experimental-jitを指定してビルドした場合と指定しなかった場合のPythonで実行速度の比較を行います。その他のオプションは指定しません。
計測コードは以下の通りです。

def compute():
    result = 0
    for i in range(100000000):
        result += i * i
    return result

num = compute()
print(num)

計測結果は以下のようになりました。

--experimental-jitあり --experimental-jitなし
1回目 6.033s 8.210s
2回目 6.040s 8.249s
3回目 6.074s 8.285s
4回目 6.039s 8.271s
5回目 6.062s 8.162s

JITを有効化すると比較的速く実行できることがわかりました。

なお、ループの部分を関数で囲わずにトップレベルで実行した場合、どちらも20秒程度かかりました。

おわりに

CPythonのリポジトリに.devcontainerが含まれていたので、WSL+Docker+Dev Containersでコンテナを作ってコマンドを実行すれば簡単にビルドできるかと思いました。
しかし、x86_64-pc-linux-muslというターゲットに対応していないのか、--experimental-jit-interpreterを指定したときにmakeが失敗してビルドできませんでした。

こちらによれば、
configureを使ったビルドなら"_Py_JIT" in sysconfig.get_config_var("PY_CORE_CFLAGS")でJITが有効化されたビルドなのか確認できるそうですが、今回の手順では確認できませんでした。
Windowsは何かと不便ですね。

Pythonの柔軟性と手軽さを維持しつつ、速くなることを願います。

Discussion