世界を動かす技術を、日本語で。

Python 3.14が登場しました。どれくらい速いのでしょうか?

概要

  • Python 3.14のリリースを受け、主要なベンチマークを再実施
  • 純粋なPythonコードを使い、他言語(Node.js、Rust)とも比較
  • JIT・Free-Threadingバリアントの効果も検証
  • シングルスレッド・マルチスレッド両方のパフォーマンスを測定
  • 結果や考察の要点を簡潔にまとめて解説

Python 3.14ベンチマーク再検証

  • 2024年11月の「Is Python Really That Slow?」記事の続編として、 Python 3.14 リリース直後に再ベンチマーク実施
  • CPython 3.9~3.14、Pypy 3.11、Node 24、Rust 1.90 を対象
  • シングルスレッド/4スレッド2台の異なるPC(Linux/Intel、macOS/Apple Silicon) で測定
  • テスト内容
    • fibo.py :再帰でFibonacci数列を計算
    • bubble.py :バブルソートで乱数配列を整列
  • 純Pythonのみ を使用し、C拡張などは除外

ベンチマークの注意点

  • 一般的なベンチマークは誤解を招きやすい ため、あくまで参考値
  • 実際のアプリケーションはC/C++/Rust等のネイティブコードも多用
  • 今回の結果は「純粋なPythonコード」に限った 一データポイント

シングルスレッドFibonacciベンチマーク

  • Python 3.143.13比で約27%高速化 (3.13は3.14の約79%の速度)
  • 3.11で大きな性能ジャンプ、それ以前は「かなり遅い」印象
  • Pypy 3.11 は3.14の約5倍高速、 Rust はさらに圧倒的
  • JIT/Free-Threadingバリアント (3.13/3.14)では、JITは再帰関数に効果なし、FTはシングルスレッドだとやや遅いが差は縮小

シングルスレッドバブルソートベンチマーク

  • Python 3.14 がCPythonで最速、ただし3.11との差はFibonacciより小さい
  • Pypy 3.11 は3.14の約18倍高速、 Node.jsRust も高速
  • JITバリアントはLinuxでやや速いが、全体の差は小さい
  • FTバリアントもやや遅いが、3.14で差が縮小

マルチスレッドFibonacciベンチマーク

  • 標準インタプリタ ではスレッド数増加でもスケーリングしない(GILのため)
  • Free-Threadingインタプリタ (GIL解除)は3.13で2.2倍、3.14で3.1倍高速化
  • JITバリアント は特に効果なし
  • Pypy も高速だが、GILの制約は同様

マルチスレッドバブルソートベンチマーク

  • 各スレッドが独立してバブルソートを実行
  • Free-Threadingインタプリタ で大幅な高速化を確認
  • 標準・JITバリアントはスレッド数増加の恩恵を受けにくい

結論・考察

  • Python 3.14 はパフォーマンスが着実に向上

  • Free-Threadingインタプリタ はマルチスレッドCPU負荷タスクで大きな可能性

  • JITインタプリタ は現状汎用的な効果は限定的

  • PypyRust は依然として圧倒的な速度

  • 実アプリのパフォーマンスは、C拡張やI/O、アルゴリズム選択など多要素依存

    • ベンチマーク結果はあくまで「純粋なPythonコード」の一例
    • 今後のCPython開発JIT/FT技術の成熟 に期待

補足

  • 全テストスクリプト・ベンチマークフレームワーク はGitHubリポジトリで公開
  • 詳細な数値・グラフは元記事参照

Hackerたちの意見

ピトン、ハハ

オランダ語ではピジトンだね。

πthon

このバージョンは他の言語を軽く凌駕してるね。まあ…半周くらいだけど。

最初はPyPIとpypy、今はPiPyだね。

簡単で手軽なPythonのベンチマークを試したいなら、https://github.com/DarkStar1982/fast_langton_ant/ を見てみて。コマンドは「python3 server.py -s 10000000 -n」で。

ちょっと脱線するけど、この人には本当に感謝してる。彼が書いたFlaskのメガチュートリアルを信じて、自分の初めてのウェブサイトを立ち上げたんだ。その後、立ち上げ直前に、アプリの最も重要な部分であるフラグメントファイルをFlaskにパイプするところで、彼が俺のStack Overflowの質問に答えてくれて、その修正を実装したら、サイトがバズったんだ。記念にリンク貼っとくね。https://stackoverflow.com/a/34391304/4180276

いい話だね!君のプロフィールから推測すると、そのサイトはhttps://yout.com/だったんじゃないかな。まだFlask使ってる?

この話をシェアしてくれてありがとう。親切にして、見知らぬ人を助けることがどれだけ大事かを示してるね。いつか誰かのために同じことができるといいな :)

あなたのおかげでいい一日になりました、サー。 :)

彼にお金を渡した?

いい話だけど、その状況で本当に命の危険があったの?

flask オフトピックだけど、新しいFlaskのロゴが本当に嫌い。古い方はヴィンテージで手作り感があって良かったのに、新しいのはまるで飢えた高校生がWordArtで遊んでるみたい。[0] - https://upload.wikimedia.org/wikipedia/commons/3/3c/Flask_lo... [1] - https://flask.palletsprojects.com/en/stable/_images/flask-na...

「fragged file」が何を意味するのか気になってる人のために言うと、クエイクのことじゃないよ。リンク先のページでも「frag」については全く触れてない。質問は、Flaskでファイルをクライアントにストリーミングする方法についてで、一度に全部メモリに読み込んでから送るのとは違うんだ。そういうことだと思った(例えばIPのフラグメンテーションもあるし)けど、このストリーミングの別の呼び方を聞くのは初めてだね。

Python言語についてのニュースを聞くたびに、2025年になってもPyPyがメインのPythonとは別の道を進んでいるのが悲しい。そういえば、GILなしのPythonがいつかGILなしのC FFIを可能にするのかな?それが実現したら、Pythonにとって大きな勝利になるね。

そう言えば、GILなしのPythonがいつかGILなしのC FFIを可能にするのかな?それが実現したら、Pythonにとって大きな勝利になるよね。今のフリースレッディングってそれだと思うんだけど?だから、AFAIKデフォルトで有効にできないんだよね。いくつかのC FFIライブラリがまだ「GILなし」になってないから。

そう言えば、GILなしのPythonがいつかGILなしのC FFIを実現するのかな?具体的にはどういう意味?C FFIは手動でGILを解放できるからね。

TeXみたいに3.14で止まっちゃわないといいな。

それがないことを願ってるの? > [ドナルド・クヌース]は、今と未来で同じ出力を生み出す変わらないシステムを持つことが、新機能を導入するよりも重要だと確信している。これは、すべてが3年後には時代遅れと見なされる世界では、すごく新鮮な考えだね。私たちの業界には病気があって、新しさを求める欲求が満たされないんだ。100年持つコードを書くことができない理由はないよ。コードはただの数学だから。数学に対してこんな態度を持つことを想像してみて。「LOL負け犬、まだ多項式使ってるの!?それって何千年も前に発明されたものでしょ?LOL時代についていけよ、みんな今はEquatelyを使ってるよ。Facebookのインターンが3人で作ったから、ほぼ新しいトレンドだよ。」いや、私は「Equately」を使うつもりはないし、3000年前からある信頼できるアイデアにこだわるつもりだ。常に新しいバージョンを追いかけるのはやめよう。変わらないコードを書ける人が、本当にこの業界に貢献している人たちかもしれないね。

笑った、実際にπthonジョークにはすごく合ってるね。

誰もpypyを使わない理由は何?

ベンチマークで使った2つのスクリプトは、依存関係なしの純粋なPythonで書かれてるからね。これがpypyの得意分野なんだ。ネイティブコードを含め始めると、JITの効率が下がるけど、それでも純粋なPythonコードのパフォーマンスはすごいから、もっと遊んでみようと思ってる!

現在はPython 3.11だけに対応してるんだ。それが大きな理由だね。

実際の世界では、パフォーマンスが必要なコードの場合、プロファイラーを使ってI/Oに時間がかかっているか、ネイティブコード内で時間がかかっているかを確認するんだ。

定期的にチェックしてるけど、pypyはサードパーティのライブラリサポートのせいで、うちではほとんど使えないんだ。例えば、psycopy2は、少なくとも数年前はそうだった。最近は確認してないけど。

人気のあるPythonライブラリと相性が悪いんだよね。特に、NumPyやPandas、TensorFlowなどの多くの人気ライブラリはCPythonのC APIに依存してるから、問題が起きることがある。

自分のことだけ言うけど、毎年最新のCPythonバージョンには、実行速度よりも自分の仕事に大きな影響を与える機能があるんだ。今年はテンプレート文字列、zstd、アノテーションの遅延評価が楽しみだよ。

PSFに認められてないからだよ。それに、いつも遅れてるから、フレームワークxやパッケージyの最新バージョンを使いたいなら、もうどうしようもない。Pythonのライブラリは、純粋なPythonで後方互換性があるって自慢してたけど、みんなを3.xに移行させるための押しがあったせいで、それがなくなっちゃったのは残念だと思う。

使えるところでは使ってるけど、残念ながらそういう場所はコンパイラの恩恵を受けないスクリプトが多いんだ。プロジェクトはメンテナンスモードに入ってるし、もし有名になりたい人がいたら、pypyをサポートしてあげて。

同じことをずっと考えてる。ほとんどの場合、かなりのスピードアップになるし、(apt)でインストールするのも簡単だよね。公開プロジェクトでは、デフォルトでシェバンをenv python3にしてるけど、その下に「pypyがある人は使ってね」ってコメント入れてる。pypyをインストールしてる人はあんまりいないけど、Python3はみんな持ってることが多いし(OSに最初から入ってることも多いし、手動でインストールしてる場合もある)。なんでなんだろうね。人気やブランドの意識の問題かな?

Pythonの使い方の多くは、CPUパフォーマンスなんて全然気にしないんだよね。CPUパフォーマンスを気にする場合は、ほとんどがnumpyやscikit-learn、pandas、pytorch、tensorflow、nltk、あるいは高速なC、C++、Fortranコードのラッパー的なPythonライブラリを使ってる。これらの使い方では、インタープリターのパフォーマンスなんてほとんど関係ないし、私の経験では、そういうネイティブライブラリをPyPyで動かすのは面倒だよ。だから、プログラムのどこかでそういうライブラリを使ってるなら、CPythonを使う方がずっと楽。Pythonインタープリターの悪いパフォーマンスが重要になるケースもあって、PyPyが実用的な選択肢になることもあるけど、そういうケースは残念ながら一般的じゃないし、PyPyが人気になるほど便利じゃないんだよね。(とはいえ、全然人気がないわけでもないけど。)

私にとって一番興味深いのは、PyPyがマルチスレッドのコードでもフリースレッドのCPythonより速いってこと。

すごくいい投稿だね。人間向けのベンチマークが見られて嬉しい。面白半分でRakuで試してみたら:(0, 1, + ... *)[40] #0.10s user 0.03s system 63% cpu 0.214 total 笑 ほんと、Pythonはスクリプト言語からパフォーマンスを引き出すためにすごいことやってるよ。現実的には、Rakuはネイティブライブラリが少ないし(Inline::Pythonはあるけど)、コンパイラは同じレベルの最適化を達成するためにまだまだやるべきことが多いんだ(でもいつかは比較できるかも)。

これはfib(40)の同等のものだと思っていいのかな?著者のシステムではPyπで6.59秒かかったらしいけど、君のRakuでは0.21秒?著者と同じハードウェアを使ってるの?それともどちらかがもう一方のバリアントを実行して直接比較できるようにした方がいいかな?

まあ、そうだね。君は動的プログラミングを使ってるけど、ストレステストのPythonのフィボナッチコードは、メモ化なしでわざと再帰を使ってるから、計算された数に比例して関数呼び出しが増えるんだ。Rakuのコードで見てるほとんどの時間はインタープリターの起動時間だよ。Pythonはその手のトリックに強く向いてる構文がないから(APLの次点としては強くないけど、LispやHaskellの次点としては強い)、でも:

$ python -m timeit "x = (1, 0); [x[0] for _ in range(40) if (x := (x[0] + x[1], x[0]))][-1]"
50000 loops, best of 5: 4 usec per loop

(あるいは「レイジーイテレーター」アプローチで:)

$ python -m timeit --setup 'from itertools import islice, count' 'x = (1, 0); next(islice((x[0] for _ in count() if (x := (x[0] + x[1], x[0]))), 40, None))'
50000 loops, best of 5: 5.26 usec per loop

オブジェクト指向の開発者向け言語だけど、APIはバックエンドアプリの大量生産って感じ。

これらのテストの中で、新しい実験的なテールコールインタープリターを測定してるものはある?(https://docs.python.org/3.14/using/configure.html#cmdoption-...)それに関する記載が見つからなかったから、ないと思うんだけど。他のバリエーションとテールコールインタープリターを比較するのは面白そうだね。