Python 3.13の試験的新機能「JIT」を試してみた
はじめに
CPythonでついにJITが使えるようになりそうです。
バージョン3.13から試験的に導入されました。
頻繁に実行されるコード片を機械語にコンパイルすることで、実行速度の向上が期待されます。
環境
- 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が必要です。
私はScoopでllvm 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