私は巨大なデータセットを持っており、そのすべてのポイントについて一連のプロパティを計算する必要があります。私のコードは非常に遅いので、何らかの方法で do ループを並列化して高速化したいと考えています。各プロセッサで、データの限定されたサブサンプルの「一連のプロパティ」を計算し、すべてのプロパティを 1 つの配列に結合したいと考えています。例を使って何をしなければならないかを説明しようとします。
私のデータセットが配列であるとしましょうx
:
x = linspace(0,20,10000)
取得したい「プロパティ」は、たとえば次の平方根ですx
。
prop=[]
for i in arange(0,len(x)):
prop.append(sqrt(x[i]))
問題は、上記のループをどのように並列化できるかです。4 つのプロセッサがあり、それぞれに 10000/4=2500 ポイントの平方根を計算させたいとします。
multiprocessing
やのようないくつかのpythonモジュールを見てみましmpi4py
たが、ガイドからはそのような単純な質問に対する答えが見つかりませんでした。
編集
貴重なコメントとリンクを提供してくださった皆様に感謝します。しかし、私は私の質問を明確にしたいと思います。私はsqrt
機能にまったく興味がありません。ループ内で一連の操作を行っています。私はループが悪いことを完全に知っており、ベクトル演算は常にループよりも望ましいですが、この場合は実際にループを実行する必要があります。この質問に不必要な複雑さが追加されるため、問題の詳細には立ち入りません。各プロセッサがその一部を実行するようにループを分割したいと思います。つまり、それぞれのループの 1/40 でコードを 40 回実行し、結果をマージできますが、これはばかげています。これは簡単な例です
for i in arange(0,len(x)):
# do some complicated stuff
私が望むのは、これを行うために40 cpusを使用することです:
for npcu in arange(0,40):
for i in arange(len(x)/40*ncpu,len(x)/40*(ncpu+1)):
# do some complicated stuff
それはpythonで可能ですか?