Ich habe eine Frage darüber, wie man eine Matrix parallel füllt. Ich versuche es in Python Zeile für Zeile. Aber die Zeit, um es parallel zu tun, ist am schlechtesten als die sequentielle Verarbeitungszeit. Wie kann ich es effizient machen? Hinweis: Ich muss den Wert der Indizes kennen (i und j).Eine Matrix parallel füllen
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']))
Parallel
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'])))
Ich denke, dass es in einer vektorisierten Art und Weise ohne Schleife gemacht werden kann. Können Sie Ihre Frage mit einer Beispiel-Eingabematrix aktualisieren (5 Zeilen sollten ausreichen), eine kurze Beschreibung dessen, was Sie mit diesen Daten machen möchten und die gewünschte resultierende Matrix? – MaxU
Sie können auch überprüfen, dass [die] (http://docs.scipy.org/doc/scipy-0.14.0/reference/spatial.distance.html) _vectorized_ Funktionen – MaxU
In diesem Fall kann ich nicht Numpy verwenden , weil die euclidean_distance-Funktion eine geeignete Methode für diesen Fall ist und kein Framework es so implementiert, wie ich es brauche. – user3108967