Python 3.15はどのくらい速いですか?
Miguel GrinbergがPython 3.15上でさまざまなワークロードとハードウェアに対してベンチマークスイートを再実行し、インタプリタがどこで速くなり、どこで速くならなかったかを報告。グラフはシングルスレッドとマルチスレッドのテストを並べて示している。
日本語
コピー

2026年10月5日公開、カテゴリ:
また10月が来た。新しい Python を試す季節である(厳密には 3.15.0rc3 を使っており、正式版の 3.15 はあと数日でリリースされる)。1年前に Python 3.14 のパフォーマンスを書いたときと同じように、今年も非公式の Python ベンチマークを新たに回し、Python 3.15 を 3.10 まで遡る各バージョンのインタプリタと比較する。
グラフには興味がなく分析だけ読みたい人は、文末の結論まで飛ばしてよい。
ベンチマーク
今このベンチマークを「非公式」と呼んだ。どういう意味か。
プログラミング言語の性能を客観的かつ普遍的に測ることは不可能だ。できるのはプログラムを書いて走らせ、その性能データを得ることだけである。別のプログラムが似た性能特性を示すかもしれないし、示さないかもしれない。それは分からない。このベンチマークは Python の各バージョン間で性能がどう変化したかを感じ取るためのものであり、Python インタプリタの包括的な性能像を作るつもりはないとはっきり言っておく。
今回のベンチマークでは fibo.py と bubble.py という2つのプログラムを走らせる。自分で確認できる。過去のベンチマークと同じプログラムだ。1つ目はフィボナッチ数列の数を計算し、2つ目はバブルソートアルゴリズムで数を並べ替える。
この2つを選んだのは、それぞれ別の種類のアルゴリズムを代表させたかったからだ。フィボナッチの計算は再帰を使うが、再帰は Python インタプリタでは効率が悪いと感じている。一方、バブルソートは for ループだけで、再帰は使わない。このベンチマークがカバーしていない種類のプログラムもある。特に I/O バウンドなコードは含めていない。
ここ数バージョンの Python では性能向上の一部がマルチスレッドに関係しているので、各プログラムにマルチスレッド版も書き、合計4種類のテストにした。
テストマトリクス
完全なテストマトリクスはかなり複雑だ。4種類のプログラム変種をすべての Python バージョンで走らせる必要があり、JIT と free-threading に対応するバージョンではさらにこの2つのモードも走らせる。これまでのベンチマークでこのインタプリタがかなり良い性能を示してきたので、PyPy でも走らせるのが習慣になっている。Python の性能をより大きなエコシステムの中で見るために、この2つのプログラムを JavaScript(Node.js)と Rust にも移植した。
実際に使ったテストマトリクスは以下のとおり。
- テストスクリプト2本
- fibo.py:再帰で Fibonacci 数を計算
- bubble.py:ランダムに生成した数の集合をソート、再帰なし
- スレッドモード2種類
- シングルスレッド
- 並列4スレッド
- Python 6バージョン、加えて最近のバージョンの PyPy、Node.js、Rust:
- Python インタプリタ3種類
- 標準
- Just-In-Time(JIT):CPython 3.13+ のみ
- Free-threading(FT):CPython 3.13+ のみ
過去のベンチマークを読んだ人なら覚えているかもしれないが、以前のマトリクスには Linux と macOS という軸もあった。直近2回のテストで両者に目立った差がなかったので、今回は macOS のテストを外し、すべて Linux ノート PC 上で実行した。マシンは Intel Core i5 CPU で、Gentoo Linux が動いている。
各対象の性能は、テストプログラムを3回走らせて所要時間の平均を取って測った。以下の結果表には 3.15 に対する速度差も載せ、適切な場合はそのインタプリタの前バージョンに対する速度差も載せる。速度比較は単純な比で表す。1x は同じ速度、0.5x は速度が半分(所要時間が2倍)、2x は2倍速い(言い換えれば所要時間が半分)、以下同様。これで十分伝わるはずだ。
テスト1:fibo.py、シングルスレッド
始めよう。最初のテストは最初の40個のフィボナッチ数を計算する。
| fibo(40) - 1スレッド | 所要時間(秒) | 3.15 比 | 前バージョン比 |
|---|---|---|---|
| 3.10 | 15.9442 | 0.44x | |
| 3.11 | 9.4058 | 0.74x | 1.70x |
| 3.12 | 8.8545 | 0.78x | 1.06x |
| 3.13 | 8.8174 | 0.79x | 1.00x |
| 3.14 | 7.1659 | 0.97x | 1.23x |
| 3.15 | 6.9361 | 1.03x | |
| pypy3.12 | 1.2517 | 5.54x | |
| node-26.3 | 1.3899 | 4.99x | |
| rust-1.97 | 0.0898 | 77.24x |
以下は、上記の速度をグラフ化したものです。

この結果から分かるのは、このテストでは Python 3.15 が 3.14 よりわずかに速い程度で、結論を出すには足りないということです。例年どおり、PyPy 3.12 の性能は桁外れで、3.15 の 5.5 倍に達し、Node.js すらわずかに上回っています。Rust は当然の結果ですが、限界を知っておくのは悪いことではありません。
各 Python バージョンを前のバージョンと比べると、興味深い事実が見えてきます。前バージョンから性能が大きく向上したのは Python 3.11 と 3.14 の 2 つだけです。グラフを見れば明らかで、ある棒の高さが前の棒よりはっきり下がっています。それ以外のバージョンは横ばいか小幅な改善にとどまり、全体としては右肩上がりに進歩し続けています。
次の結果は、同じテストにおける Python の JIT 版と free-threading(FT)版の進展を示したものです。なお、この 2 つの Python インタプリタ変種は 3.13 で導入されたため、評価できるバージョンの範囲はずっと狭くなります。
| fibo(40) - 1 スレッド | 所要時間(秒) | 3.15 との比較 | 前バージョンとの比較 |
|---|---|---|---|
| 3.13 JIT | 8.8339 | ||
| 3.14 JIT | 7.1587 | 1.23x | |
| 3.15 JIT | 5.7625 | 1.20x | 1.24x |
| 3.13 FT | 12.0368 | ||
| 3.14 FT | 7.1185 | 1.69x | |
| 3.15 FT | 7.0298 | 0.99x | 1.01x |
以下はこれらの結果を含むグラフです。

中でも注目すべきは、3.15 の JIT が同じテストで標準インタプリタより速い点です。これは例年には当てはまりませんでした。1.20 倍の高速化は小さくなく、この結果にはかなり胸が躍ります。
free-threading 側に期待できるものはありません。このテストはシングルスレッドですから。ただ、free-threading インタプリタの性能は 3.14 とほぼ同等と言えます。
テスト 2:bubble.py、シングルスレッド
2 つ目のテストを見てみましょう。以下はシングルスレッドのバブルソートテストの表とグラフで、10,000 個の乱数をソートする設定です。
| bubble(10000) - 1 スレッド | 時間(秒) | 3.15 との比較 | 前バージョンとの比較 |
|---|---|---|---|
| 3.10 | 3.9918 | 0.49x | |
| 3.11 | 2.6237 | 0.75x | 1.52x |
| 3.12 | 2.7341 | 0.72x | 0.96x |
| 3.13 | 2.833 | 0.70x | 0.97x |
| 3.14 | 2.0575 | 0.96x | 1.38x |
| 3.15 | 1.9716 | 1.04x | |
| pypy3.12 | 0.1073 | 18.37x | |
| node-26.3 | 0.0643 | 30.66x | |
| rust-1.97 | 0.0391 | 50.42x |

前のテストと同様、ここでも 3.15 の 3.14 に対する性能向上はごくわずかです。同じく、3.11 と 3.14 が近年で実際に性能を大きく変えた 2 つの Python バージョンであることも分かります。このテストではわずかに後退したバージョンもあります。PyPy は相変わらず速いものの、このテストでは Node.js のほうが速くなっています。
以下の表とグラフは、Python インタプリタの JIT 版と free-threading 版の結果を示しています。
| bubble(10000) - 1 スレッド | 時間(秒) | 3.15 との比較 | 前バージョンとの比較 |
|---|---|---|---|
| 3.13 JIT | 2.5887 | ||
| 3.14 JIT | 2.3624 | 1.10x | |
| 3.15 JIT | 1.5435 | 1.28x | 1.53x |
| 3.13 FT | 4.1888 | ||
| 3.14 FT | 2.7248 | 1.54x | |
| 3.15 FT | 2.6808 | 0.74x | 1.02x |

このグラフは最初のテストが示した全体像と一致しています。3.15 の JIT はここでも標準インタプリタの 1.28 倍という高速化を叩き出しており、かなりのものです。free-threading 版は標準インタプリタより性能が落ちていますが、3.14 のインタプリタも同程度に落ちているので、後退とは言えません。前述のとおり、このテストはシングルスレッドであり、free-threading インタプリタが強みを発揮する類のアプリケーションではないため、実際のところ大した問題ではありません。free-threading インタプリタの性能は標準版と同等であるべきで、その観点からすると、まだやることは残っています。
テスト3:fibo.py、マルチスレッド
ここで全テストをもう一度走らせるが、今回は4スレッドで並列実行する。このテストはそもそも Python インタプリタのフリースレッド版を評価するために設計されたものなので、Python 以外の項目は省く。
まずベースラインとして、標準の Python でマルチスレッドテストを走らせる。はっきり言っておくと、CPython にとってこの結果が芳しくないのは避けられない。グローバルインタプリタロック(GIL)のせいでスレッド間の真の並行実行ができないからだ。以下がマルチスレッド Fibonacci テストの結果とグラフ:
| fibo(40) - 4スレッド | 時間(秒) | 3.15 比 | 前バージョン比 |
|---|---|---|---|
| 3.10 | 67.2867 | 0.48x | |
| 3.11 | 49.726 | 0.65x | 1.35x |
| 3.12 | 38.7307 | 0.84x | 1.28x |
| 3.13 | 38.9421 | 0.84x | 0.99x |
| 3.14 | 31.8367 | 1.02x | 1.22x |
| 3.15 | 32.5421 | 0.98x | |
| pypy3.12 | 5.6385 | 5.77x |

このテストでは 3.15 が 3.14 よりわずかに遅い。シングルスレッドのテストで見たとおり、3.15 のインタプリタは 3.14 よりほんの少し速いだけなので、総じて標準インタプリタの速度は 3.14 と同程度と言える。ここでも PyPy が標準 Python を大きく引き離しているが、マルチスレッドにすると PyPy も同程度の比率で遅くなる。PyPy の並行実行も同じく GIL の影響を受けるからだ。
次に、Python インタプリタの JIT 版とフリースレッド版がこのテストでどう振る舞うかを見てみよう。
| fibo(40) - 4スレッド | 時間(秒) | 3.15 比 | 前バージョン比 |
|---|---|---|---|
| 3.13 JIT | 38.5661 | ||
| 3.14 JIT | 30.9696 | 1.25x | |
| 3.15 JIT | 27.1641 | 1.20x | 1.14x |
| 3.13 FT | 12.4376 | ||
| 3.14 FT | 7.3052 | 1.70x | |
| 3.15 FT | 7.235 | 4.50x | 1.01x |

Python 3.15 のフリースレッド版インタプリタは標準版より約4.5倍速く、3.14 でもほぼ同じ比率になる。この顕著な高速化は、インタプリタが GIL の制約から解放され、スレッドの並行実行が効率化されたことに起因する。
これらの結果からもう一点読み取れる。GIL の下で動く JIT 版インタプリタは、マルチスレッドでも標準版に対して同程度の優位を保っており、これは 3.15 で初めて現れた変化だ。
テスト4:bubble.py、マルチスレッド
残るは最後の結果の組だ。以下はバブルソートテストにおける標準インタプリタの成績:
| bubble(10000) - 4スレッド | 時間(秒) | 3.15 比 | 前バージョン比 |
|---|---|---|---|
| 3.10 | 16.5959 | 0.51x | |
| 3.11 | 10.7541 | 0.79x | 1.54x |
| 3.12 | 10.979 | 0.77x | 0.98x |
| 3.13 | 11.1337 | 0.76x | 0.99x |
| 3.14 | 8.7198 | 0.97x | 1.28x |
| 3.15 | 8.4514 | 1.03x | |
| pypy3.12 | 0.5165 | 16.36x |

これもこれまでの結果とおおむね一致しており、3.15 は 3.14 よりほんのわずか速いだけだ。
このテストのベースラインが揃ったので、JIT 版とフリースレッド版も見てみよう:
| bubble(10000) - 4スレッド | 時間(秒) | 3.15 比 | 前バージョン比 |
|---|---|---|---|
| 3.13 JIT | 10.3004 | ||
| 3.14 JIT | 9.9454 | 1.04x | |
| 3.15 JIT | 6.6417 | 1.27x | 1.50x |
| 3.13 FT | 8.0547 | ||
| 3.14 FT | 4.9934 | 1.61x | |
| 3.15 FT | 4.8549 | 1.74x | 1.03x |

ここでも free-threading 版の 3.15 インタプリタが標準版を上回った。伸び幅は Fibonacci テストほど派手ではないが、この種のプログラムは依然として GIL なしインタプリタ向きのユースケースだ。
JIT の結果については、このインタプリタが他のすべてのテストで見せたのと同じ傾向で、3.15 に大きな改善があることを示している。
結論
この benchmark をそれなりに面白く読んでもらえていれば幸いだ。数字とカラフルなグラフの山を眺めて、これが実際に何の意味を持つのか気になっているかもしれない。
締める前に、これらの数字を私がどう解釈したかを書いておきたい。3.15 に上げる価値があるのか、上げたら何が良くなるのか、知りたいだろうから。この節は確定した事実の領域を離れて意見の領域に入る。だから、同じ数字を別の人が見れば、まったく違う解釈をするかもしれないということは覚えておいてほしい。
免責は済ませたので、感想を言うと、これらのテストを走らせた限りでは、Python 3.15 の性能は 3.14 と比べてせいぜい小幅な改善といったところだ。今 3.14 で動かしている本番プロジェクト(このサイトもそうだ)はいずれ上げるかもしれないが、今回の結果を見て、昨年 3.14 の成績を見たときのようにすぐアップグレードしたくなる、というほどではない。
3.15 で明確に良くなっているのは JIT だけだ。ただし JIT はまだ実験的機能で、本番で使うのは賢明ではない。実験段階を抜けたら、本番で JIT を使うことも考える。
JIT 以外に、このバージョンには目立った性能向上はない。わずかに伸びたテストもあれば、後退したテストもある。こんな小さな揺らぎが実際のプロジェクトで体感できる差になるとは思えない。正直なところ、あと数か月は 3.14 に留まり、1 年後に 3.16 が出て評価対象がもう一つ増えるまで待っても、損はないと感じている。
とはいえ、3.15 を普段のメインインタプリタとして使うつもりだし、JavaScript 風のアンパック内包表記や遅延インポートといった新機能を使うために、いくつかの本番プロジェクトを上げてしまうかもしれない。
コーヒーをおごってくれませんか?
このブログを読んでくれてありがとう! この記事が役に立ったなら、Buy me a coffee から少額のワンタイム投げ銭で仕事を支援してもらえると嬉しい。カフェインも切らさずに済む。