モチベ
Pythonの高速化の手法として、multiprocessing等のモジュールを利用した並列処理とnumbaを利用したJITコンパイルによる高速化がある。
2つの高速化は競合する場合があるので、備忘録としてここにまとめる。
numbaと各並列処理手法の相性
nojit | jitfunction | jitclass | |
---|---|---|---|
MultiProcessing | O | △ | X※1 |
MultiThreading | X※2 | O | X※3 |
※1: マルチプロセスでjitclasオブジェクトを別プロセスに送ることができない。なぜなら、子プロセスに送るオブジェクトはpickleにして送るが、jitclassはpickleにできないため。子プロセスの中でjitclassのインスタンスを生成するなら問題ない。
※2: Python(Cpython)ではGlobal Interpreter Lock(GIL)によって、実行可能なスレッドが1つに制限される。そのため、マルチスレッドによる高速化は期待できない。ただ、IOバウンドなど特殊な条件では高速化できる場合もある(https://qiita.com/nyax/items/659b07cd755f2ced563f)
※3: 2022/3時点でjitclassではgilを解除をしてメソッドを実行することができない。しかし、オーバーロードでjit関数をメソッドとして入れるというゴリ押しならnogil=Trueの恩恵が得られるらしい。実装がわかりにくく、jit関数の中だけでしかオーバーロードが有効にならず使い勝手も悪い(https://numba.discourse.group/t/how-to-pass-jit-options-to-jitclasses/177/5)。