順列ジェネレーターからの項目で実行したい作業が CPU 集中型である場合は、おそらくスレッドではなくプロセスを使用することをお勧めします。CPython のグローバル インタープリター ロック (GIL) は、CPU にバインドされた作業を行う場合に限られた価値のマルチスレッドを作成します。
代わりに、次のようにmultiprocessing
モジュールのPool
クラスを使用します。
import multiprocessing
import itertools
def do_stuff(perm):
# whatever
return list(reversed(perm))
if __name__ == "__main__":
with multiprocessing.Pool() as pool: # default is optimal number of processes
results = pool.map(do_stuff, itertools.permutations('1234', r=4))
# do stuff with results
results
(リストとして何かを行うのではなく) 繰り返し処理する場合は、ワーカー プロセスから生成された結果を処理するために使用できる反復子を取得する代わりに使用できることに注意してくださいimap
。map
アイテムが返される順序が問題にならない場合はimap_unordered
、メモリを少し節約するために使用できます (と思います)。
if __name__ is "__main__"
ボイラープレートは、モジュールが OS の制限を回避する必要がある Windows で必要です( multiprocessing
no fork
)。