1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

python 3.13t GIL無効化設定 - ②CPU-Bound実行時間計測

Last updated at Posted at 2024-11-11

はじめに

2024年10月、GIL無効化設定が可能のpython 3.13が正式にリリースされました。
GIL有効・無効により、CPU-Bound処理の実行時間を計測してみました。

環境

  • python: 3.13
    python3.13をinstallした後、python.exeとpython3.13t.exeが作成されます。後者はfree-threadingのGIL無効版です。
    image.png
  • OS: windows 11
  • other: Powershell

Single-thread

CPU-Bound

Code(single_thread_cpu.py 疑似CPU-Bound)

from threading import Thread

COUNT = 5000000
def countdown(n):
    while n>0:
        n -= 1
if __name__ == '__main__':
    countdown(COUNT)

GIL有効の場合

PS C:\> python.exe -c "import platform,sys; print(f'{platform.python_version()}, GIL: {sys._is_gil_enabled()}')"
3.13.0, GIL: True

PS C:\> measure-command {python.exe single_thread_cpu.py} | findstr TotalMilliseconds
TotalMilliseconds : 144.5156

GIL無効の場合

PS C:\> python3.13t.exe -c "import platform,sys; print(f'{platform.python_version()}, GIL: {sys._is_gil_enabled()}')"
3.13.0, GIL: False

PS C:\> measure-command {python3.13t.exe single_thread_cpu.py} | findstr TotalMilliseconds
TotalMilliseconds : 210.0626

GIL無効の場合、実行時間が長くなりました。

Multi-threads

Code(multi_threads_cpu.py 疑似CPU-Bound)

from threading import Thread

def countdown():
    n = 5000000
    while n>0:
        n -= 1
   
def cpu_bound_multi():
    t1 = Thread(target=countdown)
    t2 = Thread(target=countdown)

    t1.start()
    t2.start()

    t1.join()
    t2.join()

if __name__ == '__main__':
    cpu_bound_multi()

GIL有効の場合

PS C:\> python.exe -c "import platform,sys; print(f'{platform.python_version()}, GIL: {sys._is_gil_enabled()}')"
3.13.0, GIL: True

PS C:\> measure-command {python.exe multi_threads_cpu.py} | findstr TotalMilliseconds
TotalMilliseconds : 249.4991

GIL無効の場合

PS C:\> python3.13t.exe -c "import platform,sys; print(f'{platform.python_version()}, GIL: {sys._is_gil_enabled()}')"
3.13.0, GIL: False

PS C:\> measure-command {python3.13t.exe multi_threads_cpu.py} | findstr TotalMilliseconds
TotalMilliseconds : 232.4705

まとめ

  • 5000000回の繰り返し処理の実行時間(Libraryのimportコスト込み)
GIL Single-Thread Multi-Threads
有効 144ms 249ms
無効 210ms 232ms
  • GIL有効の場合、Multi-Threadsの実行時間(249ms)がSingle-Thread(144ms)の約2倍ですので、並列処理できていないことが分かりました。
  • 一方で、GIL無効の場合、Multi-Threads(232ms)とSingle-Thread(210ms)の実行時間に大差がないですので、並列処理が可能であることを理解できました。
  • しかし、Single-Threadの場合、GIL有効と比べると、GIL無効での実行時間が長くなりました(144ms⇒210ms)。当面はGIL無効化によるパフォーマンスの低下が避けられないです。
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?