Pythonのマルチプロセッシングパッケージの使用方法を学習しようとしていますが、map
とimap
の違いがわかりません。
map
が実際の配列またはセットを返すのに対して、imap
は配列またはセットの反復子を返すという違いはありますか?どちらを使用するのですか?
また、chunksize引数が何であるかわかりません。これは各プロセスに渡される値の数ですか?
それが違いです。 mapの代わりにimapを使用する理由の1つは、残りの計算が完了するのを待たずに最初のいくつかの結果の処理を開始したい場合です。 mapはすべての結果を待ってから戻ります。
チャンクサイズについては、ワーカーがより多くの作業を要求するたびにIPCと同期のオーバーヘッドが存在するため、作業を大量に行う方が効率的である場合があります。
imapは、pythonで高速かつメモリ効率を高めるために使用されるitertoolsモジュールからのものです。Mapはリストを返すここでimap オブジェクトを返すは、反復ごとに値を生成します(In python 2.7)。以下のコードブロックは違いを解消します。
マップはリストを直接印刷できます
from itertools import *
from math import *
integers = [1,2,3,4,5]
sqr_ints = map(sqrt, integers)
print (sqr_ints)
imapは、リストに変換されて印刷されるオブジェクトを返します。
from itertools import *
from math import *
integers = [1,2,3,4,5]
sqr_ints = imap(sqrt, integers)
print list(sqr_ints)
Chunksizeは指定されたサイズ(概算)の断片に分割する反復可能を作成し、各断片は個別のタスクとして送信されます。
Imapを使用すると、フォークされた呼び出しは並列で行われ、順次ではありません。たとえば、以下の例では、注文書を入手するために3つの取引所にアクセスしています。エクスチェンジ1、エクスチェンジ2、エクスチェンジ3の順にヒットする代わりに、imap.poolコールは非ブロッキングであり、コールするとすぐに3つすべてのエクスチェンジに直接行き、注文帳をフェッチします。
from pathos.multiprocessing import ProcessingPool as Pool
pool = Pool().imap
self.pool(self.getOrderBook, Exchanges, Tickers)