0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CPythonの実験的JITはなぜ止まったのか:4〜12%改善でも消える理由を読む

0
Posted at

CPython の実験的 JIT は、3.15 時点で pyperformance の geometric mean をおよそ 4〜12% 改善した。数字だけ見れば、実験は十分に前進しているように見える。しかも PEP 836 の付録では macOS(M3 Pro)で 12.6%、x86-64 Linux でも本文では 7〜8%(付録の集計期間では 6.9%)改善と、公式の説明はかなり手応えがある。ところが、その JIT は「速くなったから残る」流れには乗らなかった。

画像: peps.python.org より
画像: peps.python.org より

ここで見落としやすいのは、CPython では速度向上そのものが最終判断ではないことだ。Python は本体だけで完結する言語ではなく、拡張モジュール、デバッガ、プロファイラ、配布物、そして運用の癖まで含めて一つの実行基盤として扱われる。JIT が速いかどうかと、CPython の main ブランチに置き続けてよいかどうかは、別の問いとして審査される。

2026 年 6 月、Steering Council は JIT の新規開発を止め、支持可能な Standards Track PEP が通らなければ main から削除すると告げた。理由は単純な「性能不足」ではない。むしろ、速度が出始めたからこそ、保守責任や互換性の説明責任が重くなった。速くなる途中の機能を、どこまで「実験」として許すかが争点になった。

この JIT はそもそも、2024 年に 3.13 の main へ入った時点で、完成品として扱われていたわけではない。PEP 744 は Informational で、実験としての位置づけを明示していた。つまり、動くことは示したが、長期保守の約束まではしていない。その段階では許された曖昧さが、3.15 で速度が見え始めた瞬間に、逆に問題として浮かび上がった。

実験のまま main に置くと、何が面倒になるのか

Steering Council が気にしたのは、JIT の有無で CPython の振る舞いが揺れ始めることだった。インタープリタの内部を変えると、同じ Python コードでも、デバッグやプロファイリングの見え方が変わる。ユーザーから見れば「速い版」と「遅い版」ではなく、「昨日と今日で少し違う CPython」が現れる。これは実験段階ならまだしも、main に置き続けるには重い。

PEP 836 が求められた背景には、そこを言葉にしてほしいという要求があった。長期保守、互換性、性能目標、プラットフォーム対応、メモリ負荷、安全性、redistributor への影響。どれも個別には耳慣れた論点だが、JIT では全部が同時に効く。たとえば、公式バイナリは JIT をビルドしたまま無効にして配る。配布側は、いつ有効化するか、どの環境で保証するかを抱え込むことになる。

面白いのは、PEP 836 が「最初の 1 年は開発者体験を改善する」と書きつつ、トレース記録型から method-based frontend への移行を打ち出していた点だ。ここは単なる内部実装の話に見えて、実は運用の話でもある。実験の継続は、コードが速いかではなく、開発者が理解しやすいか、追試しやすいか、壊れたときに責任範囲を切り分けられるかに直結する。

さらに、Steering Council は「これは supported feature にする条件を議論しているのではない」と切り分けた。評価していたのは、JIT を正式採用するかではなく、そもそも main で実験を続けてよいかだった。この一段手前の問いが厄介で、性能が少し上がっただけでは答えられない。実験が本体に居座ると、他の変更の足を引っ張るかもしれないからだ。

5% と 20% のあいだにある、見えにくい壁

PEP 744 は、JIT が non-experimental になる条件として、少なくとも 1 つの人気プラットフォームで意味のある改善、たとえばおおむね 5% の向上を挙げていた。そこから PEP 836 では、JIT + free-threaded build で pyperformance の geometric mean を 20% 改善することを、3.17 の first beta までの目標に据えた。数字だけを見ると、かなり野心が跳ね上がっている。

ただし、この 20% は単なる「もっと頑張る」ではなく、保留を解くための最低ラインとして置かれている。さらにややこしいのは、比較対象が「非 JIT の free-threaded build の interpreter」であることだ。つまり、単純に JIT の有無だけでなく、free-threading という別の大改造とセットで成果を示せ、という話になる。ここで性能の議論は、一気に多変数化する。

この構図は、日本の現場でも身近だ。たとえば、社内サービスで Python を使っているとき、速度向上が欲しいのは当然だが、現実には障害調査の再現性や、監視ツールとの相性のほうが先に問題になることが多い。JIT が速くても、プロファイラが見えにくくなったり、配布物の検証手順が増えたりすると、導入判断は簡単には動かない。

PEP 836 の議論でも、こうした懸念ははっきり出ていた。メモリ消費の説明が足りない、32-bit Windows をどこまで面倒を見るのか、従来の挙動を保てない外部ツールにどんな対処手順を示すのか、などだ。速度の数字は見えるが、保守コストの数字は見えにくい。だからこそ、「何%速いか」だけを追うと、意思決定に必要な情報が欠ける。

そして PEP 836 には、最初の compatibility review を 3.17 の first release candidate 期に置き、上位 PyPI パッケージのテストを回す計画もあった。Steering Council はそこを「遅すぎる」と見た。もし互換性の崩れが本当に問題なら、2028 年近くまで待つのではなく、もっと早く、継続的に見るべきだという理屈だ。ここで問われているのは、速度の伸びしろではなく、いつ不具合のコストを払い始めるのかである。

先に進むほど、技術の外側が支配的になる

JIT の話は、最終的には「どの方式が一番速いか」だけでは終わらない。PEP 836 では、method-based frontend、free-threading 対応、外部ツールの修復経路、redistributor の再現可能なビルド、セキュリティレビューといった項目が並んでいた。つまり、性能の改善を入口にしながら、運用・保守・配布の制度設計へ話が移っていく。

LWN が伝えたように、JIT の作者たちは当初の PEP 744 から続く未解決事項に対し、supported な機能へ進むための道筋をまとめようとした。しかし Steering Council が求めたのは、単なる道筋ではなく、どこまでを保証し、どこから先は保証しないかの線引きだった。そこが曖昧なままだと、実験は「便利な実験」で終わるのではなく、「本体に置かれた未契約の責任」になる。

PEP 836 は withdrawn になったが、それで JIT の価値が消えたわけではない。むしろ、4〜12% の改善が出たからこそ、次に必要なのは速度の上積みではなく、継続開発を支える合意だと見えた。ここから先は、実装の巧拙よりも、どの条件が満たされたら main に残せるのかを詰める段階になる。その条件の中身は、まだ全部は語られていない。たとえば、20% という数字の内訳をどう読むのか、あるいは free-threaded 化と JIT をどう重ねるのか——その答えは、もう少し奥にある。

👉 続き(核心はここから)は PaPoo で読めます: https://papoo.work/doc/0ef0d05cff7cdf6c

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?