Python 3.15が正式リリースされ、同時にPython 3.10(2021年リリース)のサポートが終了しました。CIで複数のPythonバージョンをテストしているプロジェクトや、技術的負債としてバージョン更新を先送りしてきたチームにとっては、棚卸しのタイミングです。
この記事では、Python 3.15で何が変わったかを技術面で整理したうえで、スクラムやアジャイル運用のなかで「いつ、どう対応するか」を判断するための材料を示します。インフラ構築やインタプリタの内部実装には踏み込まず、チーム運用の観点にしぼって解説します。
Python 3.15の主な変更点
最も注目されているのが「explicit lazy imports(明示的な遅延インポート)」です。lazy import jsonのように書くと、そのモジュールは実際に使われた時点で初めて読み込まれます。
これはPEP 810という提案に基づく機能です。PEPとはPython Enhancement Proposalの略で、言語仕様の変更を提案・議論するための正式な文書形式を指します。
起動時に重いライブラリ(たとえば機械学習系のsentence_transformers)を読み込むと、コマンド実行のたびに数秒の遅延が発生することがあります。遅延インポートはこの種の起動コストを根本から減らす仕組みです。
もう一つの変更が、内包表記(comprehension、リストや辞書をまとめて生成する構文)でのアンパック(展開)対応です。[*L for L in lists]と書くことで、ネストしたリストを一段階フラットにできます。これはPEP 448(2015年導入)のアンパック構文をさらに拡張したものです。
プロファイリング(処理時間の計測)まわりでは、既存のcProfileがprofiling.tracingへと名前変更され、新たにprofiling.samplingというサンプリングプロファイラが標準ライブラリに加わりました。サンプリングプロファイラは、動いているプロセスのスタックトレースを一定間隔で取得し、どの関数に時間がかかっているかを推定する手法です。
従来はpy-spyのような外部ツールが必要だった処理が、標準ライブラリだけで完結するようになりました。本番環境でパフォーマンス調査をする機会があるチームには、覚えておく価値のある変更です。
パフォーマンスへの期待値をどう持つか
気になる処理速度ですが、Python 3.15単体では3.14からの大きな向上はないと報告されています。フィボナッチ数列を使ったベンチマークでは、実験的なJIT(Just-In-Timeコンパイラ、実行時にコードを機械語へ変換する仕組み)を有効にした場合のみ、約1.2倍の性能向上が確認されています。
一方、Python 3.14から3.13への移行では、より広い範囲で性能向上が見られたという調査結果があります。つまり3.15は「機能追加の年」であり、「速度改善の年」ではないという見方ができます。
この点はスプリント計画に影響します。「バージョンアップ=パフォーマンス改善」という期待でチケットを切ると、今回に限っては成果が見えにくく、見積もりとのズレが生じやすい状況です。
技術的負債としてのバージョンサポート終了
Python 3.10のサポート終了は、多くのプロジェクトにとって技術的負債の清算点になります。公式に「このバージョンでは動く」と謳っていたコードベースほど、古いバージョン向けの分岐処理や代替実装が内部に溜まっています。
たとえば標準ライブラリのtomllib(TOML形式の設定ファイルを読み込む機能)はPython 3.11から追加されました。3.10をサポート対象から外せば、これまで外部パッケージのtomliに頼っていた箇所を標準ライブラリへ置き換えられます。
同様に、SQLite連携のsetlimit()/getlimit()や、asyncioのTaskGroup・timeout()なども3.11由来の機能です。これらは「新機能を使いたい」という攻めの動機だけでなく、「サポート対象の互換コードを削除できる」という守りの動機としても評価すべきです。
スクラムで扱うなら、このタスクは「リファクタリング」枠ではなく「技術的負債の返済」としてバックログに明示的に積むのが現実的です。機能追加の合間に少しずつ、ではなく、1〜2スプリントのタイムボックスを切って集中的に片付ける方が、レビューの一貫性も保ちやすくなります。
今日確認できること
まず、自分のプロジェクトが対象になるかどうかの確認から始めます。
- CI設定(GitHub ActionsのYAMLなど)でテスト対象のPythonバージョン一覧を確認する
python --versionやpyproject.tomlのrequires-pythonでサポート下限を確認する- 3.10向けの条件分岐(
sys.version_infoを使った分岐)がコード内に残っていないか検索する
uvを使っている場合は、以下の手順で3.15を試せます。
uv self update
uv python install 3.15
uv python pin --global 3.15
uv run python --version既存ツールをuv tool installで入れている場合は、バージョンを指定して再インストールすれば確認できます。
uv tool upgrade <ツール名> --python 3.15本番導入の前に、ステージング環境やCIのマトリクステストに3.15を追加し、3.10を落とす順番で進めるのが安全です。いきなり本番の対応バージョンを変えるのではなく、サポート対象の幅を段階的に狭めていく進め方が、チームの不安を減らします。
まとめ
Python 3.15は遅延インポートやサンプリングプロファイラなど実用的な機能が増えた一方、素のインタプリタ性能は3.14からほぼ横ばいです。JITによる1.2倍の向上はありますが、まだ実験的な位置づけにとどまります。
チーム運用の観点では、Python 3.10サポート終了をきっかけに、積み上がった互換コードの棚卸しをスプリントに明示的に組み込む機会にできます。tomllibやTaskGroupなど3.11由来の機能を使えるようになる分、削除できる代替実装がないか洗い出してみてください。
まずはCI設定とrequires-pythonの記載を確認し、uv python install 3.15で手元の環境に3.15を入れてみるところから始められます。