Upgrade to Pro — share decks privately, control downloads, hide ads and more …

NumPyの計算が速い理由をGIL解放のメカニズム観点でちょっとだけ掘り下げてみた

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Kazuaki Higa Kazuaki Higa
February 20, 2026
84

 NumPyの計算が速い理由をGIL解放のメカニズム観点でちょっとだけ掘り下げてみた

Avatar for Kazuaki Higa

Kazuaki Higa

February 20, 2026
Tweet

Transcript

  1. X:@higakazuaki9 • 比嘉 一晃(ひが かずあき) • 沖縄県出身 • 株式会社iimon エンジニア ◦

    不動産DXのツールを提供 https://iimon.co.jp/ • 現在の担当業務の技術スタック ◦ vanilla-tsやReact、Django、AWS、 Google Cloud(Firebase)...etc • これまでの経験 ◦ Angular、React、Vue.js、Spring Boot、Django、Fast API、Ruby on Rails…etc • 性格 ◦ 人懐っこい、面倒くさがり、ねことビー ル好き(お酒の失敗は、、、色々ありま す) プロフィール
  2. NumPyの概要 コード例) import numpy as np ← npで命名してimportすることが多い a1 =

    [1, 2, 3] a2 = [4, 5, 6] result = np.dot(a1, a2) ← ベクトルの内積を計算する関数「 dot」 print(result) # 32 ← (1 × 4) + (2 × 5) + (3 × 6)
  3. アジェンダ 1. イントロダクション 2. NumPyの概要 3. GIL(Global Interpreter Lock) 4.

    NumPyによるGILの解放と処理フロー 5. 純粋なPythonコード vs NumPyの速度検証 6. まとめ
  4. アジェンダ 1. イントロダクション 2. NumPyの概要 3. GIL(Global Interpreter Lock) 4.

    NumPyによるGILの解放と処理フロー 5. 純粋なPythonコード vs NumPyの速度検証 6. まとめ
  5. NumPyによるGILの解放と処理フロー 処理フロー 1. Python: NumPyの関数を呼び出す(np.dot(a, b)など) 2. NumPy C拡張に処理がディスパッチ 3.

    GILを解放(マクロ: NPY_BEGIN_THREADS) 4. 純粋なC言語による計算(GILなし) 5. GILを再取得(マクロ: NPY_END_THREADS) 6. 結果をPythonに返す - NPY_BEGIN_THREADS:PythonのState(状態)を保存し、 GILを解放 - GIL解放中:Pythonオブジェクトには触れない。純 C/Fortranの数値計算のみ - NPY_END_THREADS:計算完了後、GILを再度取得して状態を復元&結果を Pythonに返す
  6. NumPyによるGILの解放と処理フロー 内部処理の一部抜粋) https://github.com/numpy/numpy/blob/main/numpy/_core/src/umath/ufunc_object.c ・・・略・・・ if (!needs_api) { NPY_BEGIN_THREADS; ← 特定の条件を満たす場合、

    GIL解放 } ・・・計算処理( C言語など)・・・ NPY_END_THREADS; ← 計算処理後にGILを取得してPython処理内の状態を復元 ・・・略・・・