2017-05-17 11 views
1

私は、時間のかかる関数に渡す引数のネストされたリスト(基本的には行列)を持っています。 multiprocess.Poolを使ってコードを並列化したいと思います。私がパラメータのリストを持っていたなら、私は単にそのリストにPool.mapと呼んでいます。並列Pool.mapをネストされたリストに適用する方法

しかし、Pool.mapをマトリックスに使用すると、結果はまだ2次元マトリックス形式になりますか?

は、私が機能f(x)、リスト、時間である、Fの評価を並列化するために、プロセスのプールを使用して

l = [[1, 2, ..., n], [n + 1, ..., 2n], [(m-1)*n, ..., n*m] 

私はリストを入手するにはどうすればよい

[[f(1), f(2), ..., f(n)], [f(n + 1), ..., f(2*n)], [f((m-1)*n), ..., f(n*m)] 

を持っていると言います消費関数?

+0

処理したいん方法の例を投稿データは – Netwave

+0

を@DanielSanchez私の質問を編集してください。可能な解決策は、リスト 'l'を平坦化し、それに' f'をマッピングし、適切に出力を再形成することです。しかし、より洗練されたPythonicメソッドがあるのだろうかと思います。 – Pincopallino

+0

以下の答えをチェックしてください。 – Netwave

答えて

1

ここであなただけのpool.mapを適用するマトリックス上mapを呼び出し、簡単な例を持っている:

import multiprocessing 


def add(x): 
    return x + 10 


if __name__ == "__main__": 

    pool = multiprocessing.Pool() # build the process pool 
    l = [range(10) for _ in xrange(10)] # we build an example list 
    res = map(lambda x: pool.map(add, x), l) # we apply the pool.map with the map to the list 
    multiprocessing.freeze_support() # this line is needed on windows only 
    print res 

これは印刷解像度である:

>>>[[10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]] 
+0

ありがとう!したがって、これは行列の各行を並列に評価します。ただし、使用可能なコアの数が行の長さの約数ではないため、一部のコアがアイドル状態になる可能性があるため、行列全体の評価を並列化するよりも効率的ではありません。行を完成させる。 – Pincopallino

+0

@Pincopallinoでは、コンピュータに搭載されているプロセッサーと同じ数のプロセスを起動するようにプールを作成する必要があります。プロセス上でピアオペレーションはこれにアプローチする方法ではありません。 – Netwave

+0

おそらく私は十分に自分自身を表現していないでしょう。私は、6つのプロセスがあり、行列の1つの行に10の要素があると、行の最初の6つの要素が評価された後、2つのコアがアイドル状態になり、残りの4つの要素が評価されるまで待機するその間に次の行の最初の2つの要素を評価することができました。あるいは、このアプローチは行列のすべての要素をまとめてキューに入れますか? – Pincopallino

関連する問題