プログラミング言語Pythonの最新メジャーリリースであるPython 3.13がリリースされた。Python 3.13では、複数行編集のような合理化された機能を備えた刷新された対話型インタプリタが導入され、ユーザーはキーを1回押すだけでコンテキスト全体を取得し、コードブロックを効率的に編集できる。さらにPython 3.13では、ジャストインタイム(JIT)コンパイラの導入とともに、グローバルインタープリタロック(GIL)の実験的な無効化が可能になり、まだ実験段階だがパフォーマンスが向上している。最後に、このアップデートではいくつかの古いモジュールが削除され、ramdomに新しい機能が導入された。
新しい対話型インタプリタ
Python 3.13では、複数行編集を始めとするエキサイティングな機能を持つ新しい対話型インタプリタが導入された。これまでは、↑キーを押すと、前のコマンドを一行ずつナビゲートしていたため、クラスや関数のような複数行の構造を編集するのは困難だった。Python 3.13では、↑を押すとコードのブロック全体が取得され、コンテキストが認識されるため、より簡単で効率的な編集が可能になった。さらに、F3を押すことで、ペーストモードを有効にし、複数行のサポートを含むコードの塊を挿入できる。
以前のバージョンでは、ユーザーは help()、exit()、quit() などの関数を入力しなければならなかった。新しい対話型インタプリタでは、ユーザーはhelpやF1とタイプするだけで、モジュールを含むPythonドキュメントを閲覧可能になった。同様に exit() と quit() についても、exitやquitと入力するだけで対話型インタプリタを終了させられる。これはREPL(Read-Eval-Print Loop)や対話型インタプリタに慣れていないプログラマからよくある不満だ。
開発者はインタープリターのclearコマンドを使って画面を消すことも可能になった。以前のバージョンのインタープリターにはこのコマンドがなく、開発者はこの動作を実現するためにターミナル設定に頼らざるを得なかった。最後に、新しいカラープロンプトとトレースバックも開発者の使い勝手を向上させている。
フリースレッド
グローバルインタープリタロック(GIL)を無効にすることが可能になった。デフォルトでは無効になっている実験的な機能である。フリースレッドモードは異なるバイナリ、例えばpython 3.13t を必要とする。簡単に言うと、GILはPythonインタプリタを制御するミューテックス(ロック)である。スレッドセーフを提供するが、同時に1つのスレッドしか実行状態にないことを意味する。
GILは、ニューラルネットワークや強化学習、あるいはCPUとGPUを使った並列処理が必要な科学計算や数値計算など、多くの種類の並列処理を困難にする。競合問題は、シングルスレッドモデルにおいて衝突を引き起こす。フリースレッドモードでは、マルチスレッドプログラミングモデルを提供することで、アプリケーションは基盤となるCPUコアをすべて消費できる。
Pythonはシングルスレッドアプリケーションには最適だ。しかし、Java、Go、Rustなどの最新の言語はすべてマルチスレッドモデルを提供し、基盤となるハードウェアを包括的に利用している。GILはPythonアプリケーションにスレッドセーフを提供してきた(例えばC言語のライブラリを使用している)。しかし、GILを削除するのはずっと困難だった。試行に失敗したり、C言語拡張への統合が壊れたりするからである。開発者はアプリケーションにシングルスレッドモデルを使うことに慣れており、GILを無効にすると予期せぬ動作を引き起こす可能性がある。
ジャストインタイムコンパイラ
実験的なJIT(ジャストインタイム)コンパイラがPythonのメインブランチの一部となった。しかし、Python 3.13ではデフォルトでオフになっている。デフォルトのビルド設定には含まれておらず、当面はこのままだろう。以下のフラグを指定することで、CPythonのビルド時にJITを有効にできる。
--enable-experimental-jit
Pythonチームはしばらくの間、この方向で機能拡張を追加してきた。例えば、Python 3.11 (PEP 659)で導入されたSpecializing Adaptive Interpreterは、プログラムの実行中にバイトコードの命令を型に特化したものに書き換える。しかし、JITは、より包括的な性能強化の配列への飛躍である。
この実験的JITは、コピーアンドパッチコンパイルを使用している。コピーアンドパッチコンパイルは、高級言語とバイトコードの高速コンパイルアルゴリズムである。バイナリ実装の多様なバリエーションを含む広範囲なライブラリコードをつなぎ合わせることで、高水準言語と低水準バイトコードの両方のプログラムをバイナリコードに落とせる高速コンパイル技術である。Haoran Xu氏とFredrik Kjolstad氏は、この論文でこのアプローチについて詳しく説明している。
現在のインタプリタとJITは同じ仕様から生成されるため、後方互換性が確保されている。PEP 744によると、テストにおいて観察可能な差異は、マイクロオペレーション変換や最適化段階によるバグがほとんどである。さらに、JITは現在、すべてのTier 1プラットフォーム、一部のTier 2プラットフォーム、および1つのTier 3プラットフォーム向けに開発されている。JITは、CPythonがPythonコードを実行する方法からの移行である。JITの性能は既存の特化型インタプリタに似ているが、ビルド時の依存関係やメモリ消費などのオーバーヘッドをもたらす。
その他の更新
Python 3.13 はいくつかのモジュールを削除し(PEP 594)、optparseやgetoptのようなツールを非推奨とし、特にCベースのライブラリの特定の組み込み機能に新しい制限を導入した。Python 3.13はrandamモジュールに対するCLI機能も追加した。ユーザーは以下のようにrandom関数を呼び出すことで、単語や文のリストからランダムな単語を生成したり、ランダムな浮動小数点数、小数、整数値を生成したり可能になった。
# random words from a sentence or list of wordspython -m random this is a testpython -m random --choice this is a test# random integers between 1 and 100python -m random 100python -m random --integer 100# random floating-point numberspython -m random 100.00 python -m random --float 100
Python 3.13では、locals の動作も変更された。これにより、同じスコープ内での今後の呼び出しに影響を与えることなく、ローカル変数と値の独立したスナップショットを返すようになった。以前の locals() は一貫性がなく、バグを引き起こしていた。この変更により一貫性が増し、開発者がデバッグを行う際に役立つ。この変更は exec と eval の locals() と globals() に影響する。
def locals_test_func() x = 10 locals()["x"] = 13 return x
Python 3.13は開発者の体験を向上させる重要な変更を導入している。インタラクティブインタプリタのような改良と、フリースレッドやJITコンパイラのような実験的な機能は、より堅牢でダイナミックなプログラミング体験を約束する。GILの実験的な無効化により、現在のライブラリやフレームワークが将来のリリースに向けて調整し、変更を加えられる。