2017-01-30 6 views
5

私は2つの引数をとり、それをmultiprocessing.Poolに追加して並列化できる関数を作成しようとしています。 この単純な関数を書くときにいくつかの問題がありました。Python:マップとマルチプロセッシングを使用

df = pd.DataFrame() 
df['ind'] = [111, 222, 333, 444, 555, 666, 777, 888] 
df['ind1'] = [111, 444, 222, 555, 777, 333, 666, 777] 

def mult(elem1, elem2): 
    return elem1 * elem2 

if __name__ == '__main__': 
    pool = Pool(processes=4) 
    print(pool.map(mult, df.ind.astype(int).values.tolist(), df.ind1.astype(int).values.tolist())) 
    pool.terminate() 

それはエラーを返します:

TypeError: unsupported operand type(s) for //: 'int' and 'list' 

私が間違っているかを理解することはできません。 誰でもこのエラーの意味と解決方法を説明できますか?

答えて

6

マルチプロセスプールモジュールでは、複数の処理を行う引数のリストを取り込み、1つの引数のみを取り入れることができます。あなたは、次の手順を実行して、この問題を解決することができます

from multiprocessing import Pool 
import pandas as pd 

df = pd.DataFrame() 
df['ind'] = [111, 222, 333, 444, 555, 666, 777, 888] 
df['ind1'] = [111, 444, 222, 555, 777, 333, 666, 777] 

def mult(elements): 
    elem1,elem2 = elements 
    return elem1 * elem2 

if __name__ == '__main__': 
    pool = Pool(processes=4) 
    inputs = zip(df.ind.astype(int).values.tolist(), df.ind1.astype(int).values.tolist()) 
    print(pool.map(mult, inputs)) 
    pool.terminate() 

私はここでやったことは、各要素は、あなたが入力したかった二つの引数であることをリストにあなたの2回の反復可能オブジェクトを圧縮されます。さて、あなたの関数の入力を変更して、それらの引数を解凍して処理できるようにします。

+0

テストケースをセットアップするのを躊躇しました。 GILを避けてCで動かすために 'pandas'が内部的に扱うことはできませんか?プールの作成とそれを調整するオーバーヘッドは、OPの難しさを修正しても賢明ではないということですか? – roganjosh

+0

パンダで入力を適切に作成して、拡張性を高める方法があると確信しています。オーバヘッドが行く限り、それはおそらくアプリケーション固有のものになるので、私が答えるのは難しいでしょう。正直言って、私はマルチプロセッシングを使うのがちょっと新しいので、あなたの質問に対する最良の答えを知っているとは思えません。しかし、私はOPが持っている特定の問題にぶつかってきました。 – tmwilson26

+0

私は今夜自分のテストケースを手に入れることができないかもしれませんが、私は調査します。マルチプロセスは、プロセスの生成に大きなオーバヘッドがあります。このアプローチを無効にするという点では、単純にベクトル化できると私は理解しています。私はあなたがきちんと質問に答えるので、私はupvotedしかし、私はちょうどアプローチの前提に欠陥があると思うが、自分自身を学ぶ:) – roganjosh

関連する問題