2011-12-04 27 views
0

私はPythonに慣れていません。私は、次の擬似コードのために外側forループを並列化したい:Pythonでマルチスレッドを使ってループを並列化する方法

for(i=1 to N){ // N and n will be taken as input for the shell script. 
    min=some garbage value 
    for(j=1 to n){ 
     val= './a.out' // call the executable a.out and take the output in val 
     if(val<min) // a.out is a random number generator script 
      min=val; 
    } 
    arr[k++]=min; 
} 
// Then I want to calculate the sum of the elements of the array 'arr'. 

次のようにシェルスクリプトを使用しようとしました。しかし、Nは非常に大きくなる可能性があります。だから、私は外側のforループを並列化するために マルチスレッドを使用する必要があります。

#!/bin/bash 
# set min to some garbage value 

N=$1 
n=$2 
for ((i=1; i<=$N; i++)); do 
    min=100000000 
    for ((j=1; j<=$n; j++)); do 
     val=$(/path/to/a.out) 
     val2=`echo $val | bc` // is this the correct syntax? 
     if (($val2 < $min)); then 
      min=$val2; 
     fi 
    done 
    arr=("${arr[@]}" "$min") 
done 

# Then I want to calculate the sum of the elements of the array 'arr'. 
sum=0 
for ((l=0; l<${#arr[@]}; l++)); do 
    sum=$(expr $sum + ${arr[$l]}) 
done 

echo "Sum of \$arr = ${sum}" 
+0

あなたの番号ジェネレータプログラムはかなりのCPU時間を要しますか?そうでなければ、複数のスレッドで内部ループを実行することでほとんど利益を得られません。 min値を計算するために一度だけ、そしてarrを更新するために一度だけ同期が必要です。 – Abhijit

+0

コンパイル済み乱数ジェネレータを使用する必要がありますか? Pythonには 'random'モジュールがあります。 Pythonは配列のすべての要素を組み込み 'sum'関数で追加することもできます(例えば、' sum([1,2,3]) 'は6の答えを得ます)。 –

答えて

0

私は並列化は、この特定の例に従う正しい道であるかどうかについての他のポスターが提起した懸念を共有していても、将来の参考のための質問に答えています。

単純なforループとスレッドを並列化するには、もちろんthreading moduleを使用できます。さらに、joblibは、それらの上に簡単な構文をもたらします(スレッドバックエンドに切り替えるように注意してください)。

免責事項:私はjoblibの元の著​​者です。

関連する問題