gpt4 book ai didi

python - 并行填充矩阵

转载 作者:行者123 更新时间:2023-12-01 03:52:22 24 4
gpt4 key购买 nike

我有一个关于如何并行填充矩阵的问题。我正在尝试用 Python 逐行执行此操作。但并行处理的时间比顺序处理的时间最差。我怎样才能高效地做到这一点?注意:我需要知道索引的值(ij)。

顺序

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'])))

最佳答案

您的代码提出了一大堆问题,太多了,无法添加注释。

def something(pos, size):
global matrix

什么是矩阵?为什么全局?由于您正在改变它,因此您不需要全局变量,即使它是在此函数之外定义的。但我更愿意看到它作为参数传入和传出。

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

这句话的重点是什么?为什么你不将结果分配给任何东西?它应该是matrix = np.zeros(shape...)?在这种情况下,矩阵是在函数中创建的,并且应该位于返回矩阵语句中,而不是全局的。

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

如果matrix是二维数组,则使用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... 函数用于处理上三角数组和下三角数组。

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']))

鉴于您迭代 i 和 j 的方式,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))

我不认为这些更改会加快计算速度,但它们应该会使计算更加清晰。

这个并行是什么?您需要提供有关您正在使用的模块或包的更多信息。这是尝试使用多核的东西吗?它是否已知可以与matrix一起使用(无论它是什么)?

这个euclidian_distance函数是什么?从其他地方进口的?

关于python - 并行填充矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38029359/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com