ホームページ  >  記事  >  バックエンド開発  >  PythonGIL のフリー スレッド モードは無効になっています)

PythonGIL のフリー スレッド モードは無効になっています)

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-11 10:17:02985ブラウズ

最近リリースされたばかりの Python 3.13 には、「フリー スレッド モード」と呼ばれる素晴らしい新機能が含まれています。これにより、スレッドを使用する場合のコードのパフォーマンスが大幅に向上します。この記事では、この機能 (デフォルトでは有効になっていません) を有効にする方法と、コードのパフォーマンスに対する「フリー スレッド モード」の影響を示します。

無料のスレッド Python をインストールする

Windows および MacOS ユーザー

Windows および MacOS ユーザーの場合は、Python Web サイトから最新のインストーラーをダウンロードしてください。 Python をインストールするときに、[インストールのカスタマイズ] オプションを選択すると、[フリー スレッド モード] を有効にするチェックボックスがあります。

Free Threaded Mode in PythonGIL disabled)

Ubuntuユーザー

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]

フリースレッドモードのパフォーマンス

実験のセットアップ

以下の簡単なコードに対するフリー スレッド モードの影響を見てみましょう:

  • 計算を行って 0 から 1,000 万までの数値の合計を返す関数ワーカーがあります。
  • ワーカー関数を 5 回連続して実行する「テスト 1」があります。
  • スレッド数が 5 の複数のスレッドを使用してワーカー関数を並列実行する「テスト 2」があります。
  • 両方のテストの実行時間を測定します。
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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。