2016-06-25 6 views
1

マトリックスを並行して塗りつぶす方法について質問があります。私は行ごとにPythonでそれをやろうとしています。しかし、それを並行して行う時間は、逐次処理時間よりも最悪です。どのように効率的に行うことができますか?注:インデックスの値を知る必要があります(iおよびj)。マトリックスを平行に塗りつぶす

Squential

def something(pos, size): 
    global matrix 

    numpy.zeros(shape=(size, size)) 

    for i in xrange(size): 
     matrix[i][i] = 0.0 

     i_lat = pos[i]['lat'] 
     i_lon = pos[i]['lon'] 

     for j in xrange(i + 1, size): 
      matrix[j][i] = matrix[i][j] = _matrix_update(pos, i_lat, i_lon, i, j) 

def _matrix_update(pos, lat, lon, u, v): 
    return 0.0 if u == v else euclidean_distance((lat, lon), (pos[v]['lat'], pos[v]['lon'])) 

パラレル

def something(pos, size): 
    global matrix 

    numpy.zeros(shape=(size, size)) 

    for i in xrange(size): 
     matrix[i][i] = 0.0 

     i_lat = pos[i]['lat'] 
     i_lon = pos[i]['lon'] 

     Parallel(n_jobs=mp.cpu_count())(delayed(_matrix_update)(pos, i_lat, i_lon, i, j) for j in xrange(i, size)) 

def _matrix_update(pos, lat, lon, u, v): 
    global matrix 
    matrix[u][v] = matrix[v][u] = (0.0 if u == v else euclidean_distance((lat, lon), (pos[v]['lat'], pos[v]['lon']))) 
+0

私はループなしでベクトル化された方法で行うことができると思います。あなたはあなたの質問をサンプル入力マトリックス(5行で十分であるはずです)で更新できますか?このデータと望む結果のマトリックスで何をしたいのですか? – MaxU

+0

また、[それら](http://docs.scipy.org/doc/scipy-0.14.0/reference/spatial.distance.html)_vectorized_ functions – MaxU

+0

をチェックすることもできます。この場合、Numpyは使用できませんなぜなら、euclidean_distance関数はこの場合の適切なメソッドであり、必要なときにフレームワークを実装するものではないからです。 – user3108967

答えて

2

あなたのコードは、コメントに入れてあまりにも多くの質問の全体の束を、発生させます。

def something(pos, size): 
    global matrix  

matrixとは何ですか?なぜglobalですか?あなたはそれを突然変異させているので、この関数の外でも定義されていても、グローバルは必要ありません。しかし、私はそれが議論として出入りするのが好きです。

numpy.zeros(shape=(size, size)) 

この声明の要点は何ですか?なぜあなたは結果に何かを割り当てていないのですか? matrix = np.zeros(shape...)とされていますか?この場合、関数内にmatrixが作成され、グローバルではなくreturn matrixステートメントに含める必要があります。

for i in xrange(size): 
     matrix[i][i] = 0.0 

matrixが2Dアレイである場合、matrix[i,i] = 0と、インデックスを。それはzeros表現で作成された場合でも、対角線これはすでに0

 i_lat = pos[i]['lat'] 
     i_lon = pos[i]['lon'] 

posは何ですか?構文は構造化された配列であることを示唆しています。これはi番目のレコードの 'lat'フィールドです。それは辞書のリストではありませんか?

 for j in xrange(i + 1, size): 
      matrix[j][i] = matrix[i][j] = _matrix_update(pos, i_lat, i_lon, i, j) 

ここでは、対称値を設定しています。繰り返し実行すると、これを実行する良い方法です。上三角アレイと下三角アレイを扱う関数はnp.tri...です。

私はこれらの変更は、計算を高速化することを期待していないが、彼らがすべき あなたはiとjに反復処理する方法を考える
def _matrix_update(pos, lat, lon, u, v): 
    return 0.0 if u == v else euclidean_distance((lat, lon), (pos[v]['lat'], pos[v]['lon'])) 

u==vが発生したことがないので、更新が

j_lat, j_lon = pos[j]['lat'], pos[j]['lon'] 
matrix[j,i] = matrix[i,j] = euclidean_distance((i_lat, i_lon), (j_lat, j_lon)) 

に単純化することができますそれをもっと明確にする。

このParallelとはなんですか?使用しているモジュールまたはパッケージに関する詳細情報を提供する必要があります。複数のコアを使用しようとするものですか? matrix(これまでのところ)と動作することが分かっていますか?

euclidian_distanceとはなんですか?どこか他の国から輸入された?