1000 個のプロセスを生成しているため、1000 個の Python インスタンスを意味します。あなたのような小さな仕事の場合、かなり遅くなります。あなたはこれを望んでいませんpp
。さらに悪いことに、ppservers
(ローカル プロセスではなく) ネットワークを介している場合、ソケット接続を作成するオーバーヘッドがあるだけでなく、ネットワークを介してコードを送信して別のコンピューターで Python インスタンスを生成するオーバーヘッドもあります( s)。ソケットとインターネット接続を使用したくない場合は、 , をpp
設定することで、強制的にローカルでのみ動作させることができますppservers=()
(既に行っているようです)。 pp
また、コードをシリアル化し、プロセス間で送信してから、他のプロセスでコード オブジェクトを再構成する必要があります。これも速度を低下させる可能性があります。ソケットをまたいでいる場合や、生成された Python インスタンスでメモリを固定している場合を除き、10 分は期待できません。
pp
この場合の代わりにスレッドを使用することをお勧めしmultiprocessing
ます-つまり、関数が小さいように見えるため、ライブラリです。
優れた抽象化を提供するライブラリが必要な場合は、コードを変更せずに特定のジョブにデプロイするライブラリpp
をmultiprocessing
選択できますpathos
。 また、高速化に役立つpathos
デフォルトと微調整も提供します。pp
次に、どの方法で関数を実行するのが最も速いかをテストし、それを実行できます。
>>> import pathos.pp as pp
>>> import pathos.multiprocessing as mp
>>>
>>> def squared(x):
... return x**2
...
>>> pppool = pp.ParallelPythonPool()
>>> mppool = mp.ProcessingPool()
>>>
>>> res = pppool.amap(squared, xrange(1000))
>>> sqd = mppool.map(squared, xrange(1000))
>>> sqd[:10], sqd[-10:]
([0, 1, 4, 9, 16, 25, 36, 49, 64, 81], [980100, 982081, 984064, 986049, 988036, 990025, 992016, 994009, 996004, 998001])
>>>
>>> sq = res.get()
>>> sq[:10], sq[-10:]
([0, 1, 4, 9, 16, 25, 36, 49, 64, 81], [980100, 982081, 984064, 986049, 988036, 990025, 992016, 994009, 996004, 998001])
>>>
>>> thpool = mp.ThreadingPool()
>>> s = thpool.imap(squared, xrange(1000))
>>> s = list(s)
>>> s[:10], s[-10:]
([0, 1, 4, 9, 16, 25, 36, 49, 64, 81], [980100, 982081, 984064, 986049, 988036, 990025, 992016, 994009, 996004, 998001])
上記では、非同期 (非ブロッキング) マップを使用しmultiprocessing
ながら、ブロッキング マップを使用しています。pp
その後、スレッドでイテレータ マップを実行します (レバレッジmultiprocessing
)。ところで、クラスタ スケジューラpathos
への接続も提供します (上記には示されていません)。MPI
pathos
ここにアクセスしてください: https://github.com/uqfoundation