「一般的な」Python関数を並列実行するために使用できる「ブラックボックス」ツールを探す前にmy_function()
、手動で並列化する方法を分析することをお勧めします。
まず、実行時間my_function(v)
とpython for
ループのオーバーヘッドを比較します。[C] Python for
ループはかなり遅いため、費やされる時間はmy_function()
ごくわずかです。
>>> timeit.timeit('pass', number=1000000)
0.01692986488342285
>>> timeit.timeit('for i in range(10): pass', number=1000000)
0.47521495819091797
>>> timeit.timeit('for i in xrange(10): pass', number=1000000)
0.42337894439697266
my_function(v)
ループを必要としない単純なベクトル実装があるかどうかを2番目に確認します。F[:] = my_vector_function(X)
(これら2つの最初のポイントは非常に些細なことです。完全を期すためにここで言及した場合はご容赦ください。)
少なくともCPython実装の場合の3番目の最も重要なポイントは、my_function
そのほとんどの時間がグローバルインタープリターロック、またはGILの内部であるか外部であるかを確認することです。GIL以外で時間を費やす場合は、標準ライブラリモジュールを使用する必要があります。(ここに例があります)。ところで、GILをリリースするためだけにCの拡張として書くことを考えることができます。threading
my_function()
最後に、my_function()
GILをリリースしない場合、multiprocessing
モジュールを使用できます。
参照:同時実行に関するPythonドキュメント、および並列処理に関するnumpy / scipyイントロ。