はじめに
Pythonは、バージョン3.9から1年おきのリリースを続けてきており、この10月7日にバージョン3.14として最新版がリリースされました。本連載では、これを受けて最新バージョンである3.14の魅力的な新機能をカテゴリ別に紹介します。Python 3.14の新機能の一覧については、第6回を参照してください。
対象読者
- Pythonの最新の機能を把握したい方
- Pythonの経験者で、Pythonに改めて入門したい方
- プログラミング言語の最新パラダイムに関心のある方
必要な環境
本記事のサンプルコードは、以下の環境で動作を確認しています。
-
macOS Sequoia
- Pyenv 2.6.9、Python 3.14.0
- Visual Studio Code 1.105.1(拡張機能Python 2025.18.0)
[NOTE]サンプルの実行
掲載サンプルは、それぞれの.pyファイルに記述されています。動作確認は、PyenvをHomebrewでインストールしたmacOS上で、Python 3.14.0をインストールしてターミナルから行っています。
フリースレッドPythonの正式サポート[3.14]
Python 3.14では、グローバルインタプリタロック(GIL; Global Interpreter Lock)を使わないフリースレッドモード(Free-threading mode)を正式採用しました。これにより、マルチスレッド処理の高速化が期待できます。
グローバルインタプリタロックとは、インタプリタ全体で一つのロックを持つことです。シングルスレッドのプログラムではロック機構がシンプルになるので速度面の恩恵が受けられる、C言語などのスレッドセーフでないライブラリの利用が容易になる、などのメリットを得られます。反面、マルチスレッドのプログラムでは並行性に制限が加わり、期待する性能を得られないというデメリットが発生します。
例えば、複数のCPUコアを使った同時処理が制限されるので、CPUバウンドな処理(CPUの処理能力がボトルネックになる処理)に弱くなります。一方で、I/Oバウンドな処理(入出力性能がボトルネックになる処理)には有効に機能します。
フリースレッドモードは、このグローバルインタプリタロックを無効にすることで、インタプリタの動作、特にマルチスレッド処理の高速化を図るモードです。
Python 3.13でフェーズ1として実験的に導入されていましたが(第5回を参照)、Python 3.14においてフェーズ2に移行して、正式採用となりました。正式採用にあたり、Python 3.13において一時的とされていたフリースレッドモードにおける問題点の回避策は、より永続的とされる回避策に置き換えられました。
ただし、Pythonエコシステムの互換性のため、フリースレッドモードのPythonはオプション扱いとなり、ビルド時のコンフィギュレーションにPy_GIL_DISABLEDの指定が必要となっています。既定で提供されるのは、従来のグローバルインタプリタロックを採用したPythonとなります。
また、今回フェーズ2に移行したことで、将来にわたって利用できることがほぼ確実となりました。フェーズ3においてはフリースレッドモードが既定となる見込みですが、これが将来のPython 3.15で実現するかは、現時点では未定とされています。
フリースレッドモード対応版、GIL有効の判定
フリースレッドモードが正式採用となったことで、今後はこのモードで動作するプログラムを記述することも増えていくと思われます。
例えばフリースレッドモードでは、従来のGILが有効なPythonよりも明確にCPUバウンドな処理のスレッド化を進め、I/Oバウンドな処理をコルーチン(asyncio)で書き分けるなどです。この場合に、インタプリタがフリースレッドモードでビルドされているか、そうでない場合にGILが無効化されていないかの判定を行えると、コードの書き分けも容易になるでしょう。
import sysconfig, sys
if __name__ == "__main__":
print("Is free-threaded build?:", sysconfig.get_config_var("Py_GIL_DISABLED"))
print("Is GIL enabled at runtime?:", sys._is_gil_enabled())
// 0, True
フリースレッドモード対応版かどうかは、ビルド時のコンフィギュレーションにPy_GIL_DISABLEDが指定されたかをget_config_var関数で調べることができます。同様に、GILが有効かどうかは_is_gil_enabled関数で調べることができます。
