最近リリースされたばかりの Python 3.13 には、「フリー スレッド モード」と呼ばれる素晴らしい新機能が含まれています。これにより、スレッドを使用する場合のコードのパフォーマンスが大幅に向上します。この記事では、この機能 (デフォルトでは有効になっていません) を有効にする方法と、コードのパフォーマンスに対する「フリー スレッド モード」の影響を示します。
Windows および MacOS ユーザーの場合は、Python Web サイトから最新のインストーラーをダウンロードしてください。 Python をインストールするときに、[インストールのカスタマイズ] オプションを選択すると、[フリー スレッド モード] を有効にするチェックボックスがあります。
Ubuntu ユーザーの場合は、ターミナルで次のコマンドを実行してこの機能を有効にできます。
sudo add-apt-repository ppa:deadsnakes sudo apt-get update sudo apt-get install python3.13-nogil
パッケージをインストールした後、python3.13 (オリジナル) および python3.13-nogil または python3.13t (無料のスレッド Python) を使用してコードを実行できます。
Linux ディストリビューションに実験版 Python 3.13 をインストールする方法の詳細については、この記事を確認してください。
Python で「フリー スレッド モード」が有効になっていることを確認するには、次のコマンドを使用できます。
python3.13t -VV Python 3.13.0 experimental free-threading build (main, Oct 8 2024, 08:51:28) [GCC 11.4.0]
以下の簡単なコードに対するフリー スレッド モードの影響を見てみましょう:
import sys import threading import time print("Python version : ", sys.version) def worker(): sum = 0 for i in range(10000000): sum += i n_worker = 5 # Single thread start = time.perf_counter() for i in range(n_worker): worker() print("Single Thread: ", time.perf_counter() - start, "seconds") # Multi thread start = time.perf_counter() threads = [] for i in range(n_worker): t = threading.Thread(target=worker) threads.append(t) t.start() for t in threads: t.join() print("Multi Thread: ", time.perf_counter() - start, "seconds")
後で、このコードを通常の Python (python3.13 バイナリ) と無料のスレッド Python (pypy3.13t バイナリ) で実行します。
まず、Python3.13 でテストを実行します。
python3.13 gil_test.py Python version : 3.13.0 (main, Oct 8 2024, 08:51:28) [GCC 11.4.0] Single Thread: 1.4370562601834536 seconds Multi Thread: 1.3681392602156848 seconds
次に、pypy3.13t でテストを実行します。
python3.13t gil_test.py Python version : 3.13.0 experimental free-threading build (main, Oct 8 2024, 08:51:28) [GCC 11.4.0] Single Thread: 1.862126287072897 seconds Multi Thread: 0.3931183419190347 seconds
Python3.11でも試してみました:
python3.11 gil_test.py Python version : 3.11.3 (main, Apr 25 2023, 16:40:23) [GCC 11.3.0] Single Thread: 1.753435204969719 seconds Multi Thread: 1.457715731114149 seconds
Python のデフォルトには GIL (Global Interpreter Lock) ロック機構があり、マルチスレッドは実際には並列ではありません。シングルスレッドの処理時間はマルチスレッドと同様であることがわかります。
python3.11t (フリースレッドモード) では、マルチスレッドのパフォーマンスがシングルスレッドよりもはるかに高速です。したがって、マルチスレッドは実際に並列化されるようになりました。
しかし、python3.13t のシングル スレッド テストは pypy3.13 よりも少し遅いことがわかりますか?
理由がよくわからないので、何か説明があれば教えてください。
Pythonで並列処理するにはマルチスレッドを使うのが良いと思います。ただし、GIL ロック メカニズムがないと、開発者は「スレッドの安全性」に注意する必要があります。スレッド間でデータを共有します。
また、無料のスレッド モードを完全にサポートするには、ライブラリとパッケージの更新を待つ必要があります。これが、現時点ではこの「フリー スレッド モード」がデフォルトで有効になっていない理由の 1 つです。しかし、将来的には良い機能になると思います。
以上がPythonGIL のフリー スレッド モードは無効になっています)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。