【发布时间】:2016-10-28 00:22:19
【问题描述】:
我有一个关于如何并行填充矩阵的问题。我正在尝试在 Python 中逐行进行。但是并行执行的时间比顺序处理时间最差。我怎样才能有效地做到这一点?注意:我需要知道索引的值(i 和 j)。
顺序
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'])))
【问题讨论】:
-
我认为它可以以矢量化的方式完成,无需循环。您能否使用示例输入矩阵(5 行就足够了)更新您的问题,简要说明您要如何处理此数据和所需的结果矩阵?
-
你可能还想检查those vectorized函数
-
在这种情况下,我不能使用 Numpy,因为 euclidean_distance 函数是适合这种情况的方法,并且没有框架按照我的需要实现它。
标签: python loops numpy parallel-processing