Python における最大のパフォーマンスボトルネックはついに解消されたか?

Python における最大のパフォーマンスボトルネックはついに解消されたか?

パイソン Python 3.13 がリリースされ、 グローバルインタープリタロックの終わりが近づいているかもしれません

Pythonのグローバルインタープリタロック(GIL)は、基本的にゲートキーパーのようなもので、一度に1つのスレッドだけがPythonインタープリタを制御できるようにします。つまり、実行しているスレッド数やCPUコア数に関係なく、常に1つのスレッドだけがPythonコードを実行します。

シングルスレッドのプログラムを書いている場合、GILの存在を意識することすらないでしょう。しかし、CPU負荷の高いマルチスレッドコードを実行すると、その痛手は明らかです。すぐにボトルネックになってしまうのです。だからこそ、GILはPythonの世界では悪名高く、特にマルチスレッドアプリケーションでは、すべての処理を独占してしまうのです。

シングルスレッドの Python プログラムでは問題にならないため、多くの人がこれに遭遇することはありませんが、スケールアップしようとすると、壁にぶつかる可能性があります。

Python に GIL があるのはなぜですか?

Pythonは参照カウントを使ってメモリを管理します。各オブジェクトには、そのオブジェクトを指す参照の数を記録するカウンタがあります。その数が0になると、Pythonはメモリを解放します。

しかし、複数のスレッドが同時にカウンターを増減させると、すぐに混乱に陥ってしまいます。これを回避するため、Pythonはすべての共有オブジェクトをロックして競合状態を防ぐことができます。しかし、ロックの数が増えるとデッドロックの可能性も高まり、それ自体が混乱を招きます。そこでPythonは近道として、インタープリタに単一のロックを割り当てます。これにより処理はシンプルになり、デッドロックは発生しませんが、CPU依存のタスクに関してはPythonのマルチスレッドが実質的にシングルスレッドになってしまうという代償があります。

もちろん、これがコードにどの程度影響するかはコードによって異なります。I/Oバウンドであれば違いはありませんが、CPUバウンドのシステムでは、Pythonは真のマルチスレッドコードよりも常に遅れをとっています。

GILは死んだのか?

3.13 以降では、新しい実験モードが利用可能になります。

CPython は、 グローバルインタプリタロック(GIL) を無効にしたフリースレッドモードでの実行を試験的にサポートするようになりました。これは試験的な機能であるため、デフォルトでは有効になっていません。

フリースレッド実行では、利用可能なCPUコア上でスレッドを並列実行することで、利用可能な処理能力を最大限に活用できます。すべてのソフトウェアがこの恩恵を自動的に受けられるわけではありませんが、スレッド化を考慮して設計されたプログラムは、マルチコアハードウェア上でより高速に動作します。フリースレッドモードは実験段階であり、現在も改善作業が進められています。そのため、いくつかのバグが発生し、シングルスレッドではパフォーマンスが大幅に低下する可能性があります。CPythonのフリースレッドビルドでは、環境変数PYTHON_GILまたはコマンドラインオプション-X gil=1を使用して、実行時にGILを有効にした状態で実行することもできます。

私の推測では、実質的に全員が使用するようになるまでしばらくは実験的な状態を保ち、その後標準にするのではないかと思います。

これはPython 4の話題でしょうか? Python 4のリリースは今のところありませんが、「大きなリリース」番号は必要ないと思います。言語自体は変更されず、基盤となるエンジンだけが変更されるので、他のユーザーのコードを壊す心配はありません。うまくいけば、3.20より前に主流になるかもしれません。

おすすめの記事