Python Software Foundationは10月9日(現地時間)、「Python Release Python 3.15.0 | Python.org」において、プログラミング言語Pythonの最新版「Python 3.15.0」を公開した。変更点の詳細は「What’s new in Python 3.15 — Python 3.15.0 documentation」から確認できる。

Python 3.14から約1年ぶりとなる今回のメジャーアップデートでは、UTF-8の標準化や遅延インポート、実験段階のJITコンパイラーの高速化など、多岐にわたる機能改善が行われた。

  • Python 3.15が正式リリースされた 出典:Python Software Foundation

    Python 3.15が正式リリースされた 出典:Python Software Foundation

遅延インポートを導入、UTF-8を標準エンコーディングに

注目機能の1つが、モジュールの遅延インポートだ。従来のPythonではインポートされたモジュールを、その機能を実際に利用するかどうかにかかわらずインポート時点で読み込んでいた。依存関係が多いプログラムでは、モジュールの読み込みとバイトコードのコンパイルに時間を取られ、数秒の遅延につながる場合があった。

Python 3.15では「lazy import json」のように記述することで、対象を軽量なプロキシに登録し、モジュール本体の読み込みを初回アクセス時まで延期できる。明示的に指定しない限り従来の動作は変わらず、テストスイートやコマンドラインツール、依存関係の多いアプリケーションで起動時間の短縮効果が見込まれる。

テキスト処理では、UTF-8が標準エンコーディングに採用された。従来、encoding引数を指定しないopen()などのファイル操作では、ホストOSのロケール設定に従って文字コードが決まっていた。今後は新仕様により、環境設定の違いによる文字処理の不一致を減らすことが可能となる。

JITコンパイラーを高速化、frozendictなどの新しい型も追加

実験段階にあるJITコンパイラーも改良された。公開ベンチマークによると、x86-64版Linuxでは標準インタープリターとの比較で、幾何平均7~8%の性能向上を記録した。AArch64版macOSでは、より高速な末尾呼び出し型インタープリターとの比較で11~12%の高速化が示された。

データ型には新しい組み込み型frozendictが導入された。生成後に変更できない辞書型で、キーの挿入順序を保持する。すべてのキーと値がハッシュ可能な場合、オブジェクト全体もハッシュ可能になる。また、組み込み型sentinelも追加された。これはNoneが有効な値として使われる場面で、引数が省略された状態と、Noneが明示的に渡された状態を区別するための固有のプレースホルダーを生成する。従来はobject()などを使って同様の仕組みを独自に実装する方法が一般的だった。

プロファイリング機能を強化、フリースレッド版のABIも整備

プロファイリングツールをまとめる新しいパッケージが定義された。これに含まれるTachyonは、サンプリング方式の統計的プロファイラーであり、コードの変更やプロセスの再起動を必要とせず、実行中のプロセスを分析できる。実際の経過時間(実時間)、CPU時間、各スレッドがグローバルインタープリターロック(GIL)を保持する時間を計測し、対話型のフレームグラフも生成する。

CPythonでは、対応プラットフォームにおいてフレームポインターが標準で有効になった。これにより、デバッガーやプロファイラー、eBPFを使う監視ツールがネイティブの呼び出しスタックを追跡しやすくなる。

GILを使用しないフリースレッド版には、abi3tと呼ばれる独自のStable ABIが導入され、関連するC APIも変更された。拡張モジュールの開発者はこのABIを利用できるが、移行には相応のソースコード修正が必要になる場合がある(参考情報:「PEP 803 – “abi3t”: Stable ABI for Free-Threaded Builds | peps.python.org」)。

そのほか、内包表記内での「*」と「**」によるアンパックサポート、改善されたエラーメッセージ、ヘルプ出力のカラー表示、型付け機能の拡充、パッケージの起動設定ファイルも導入された。

新機能をパズルで学べる「whatsnewt」も公開

新機能を実際に試すための教材として、Barry Warsaw氏より端末上で動作するテキストアドベンチャー「whatsnewt」が提供された。全18問のパズルを含み、それぞれPython 3.15の実機能を利用して解く構成だ。コマンド「uvx --python 3.15 whatsnewt」で体験可能とされる。