はじめに
2024年10月、GIL無効化設定が可能のpython 3.13が正式にリリースされました。
GIL有効・無効により、CPU-Bound処理の実行時間を計測してみました。
環境
- python: 3.13
python3.13をinstallした後、python.exeとpython3.13t.exeが作成されます。後者はfree-threadingのGIL無効版です。
- 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無効化によるパフォーマンスの低下が避けられないです。