2017-01-27 9 views
0

私はプロセスとconcurrent.futuresを使っていくつかのPythonコードを並列化しようとしています。先ほどsubmittingで呼び出され、Future.result()を呼び出すか、Executor.map()を使って関数を複数回parrallelで実行できるようです。
私は後者が前者の単なる構文上の砂糖であるのか、パフォーマンス面での違いがあるのか​​疑問に思います。ドキュメントからはすぐには分かりません。concurrent.futures.Executor.map()の理解

答えて

0

これにより、真の並列実行ではなく、複数回の同時実行が可能になります。

パフォーマンスは賢明ですが、私は最近、ProcessPoolExecutor.submit()ProcessPoolExecutor.map()が同じタスクを完了するために同じ量の計算時間を消費していることを発見しました。注:.submit()は将来のオブジェクトを返します(fと呼ぶ)、その結果を見るにはf.resultオプションを使用する必要があります。一方、.map()はイテレータを直接返します。

並べ替えられたメソッドを使用して結果を順序付きリストに変換すると、特定のシナリオで.map()コード全体の計算時間が.submit()コード全体よりも速くなることがわかりました。

リストメソッドを使用してその結果を順序付けられていないリストに変換する場合、.submit().map()コードの計算時間は同じです。また、これらのコードは、ソートされたメソッドを使用するコードよりも高速に実行されました。

私のanswerで詳細を読むことができます。そこでは、自分のコードを共有して、どのように動作するかを確認できます。彼らがあなたに役立つことを願っています。

私はThreadPoolExecutorを使用していませんので、詳しくはコメントできません。しかし、私はProcessPoolExecutorと同じ方法で実装されており、CPUバインドされたタスクの代わりにI/Oバインドされたタスクに使用する方が適していると読んでいます。あなたはProcessPoolExecutormax_workersにどのos.cpu_count()によって返されたCPUの数にデフォルトオプションの引数であるのに対し、max_workers引数、スレッドのすなわち最大数を指定する必要があります。