【发布时间】:2020-05-17 00:02:16
【问题描述】:
我有以下算法:
- 遍历二维数组中的所有行:
- 对于每个已处理的行,我得到一维数组
- 用处理后的一维数组替换其他二维数组的行i
我想并行化这个过程,因为每一行过程都是独立的。
我的代码:
def update_grid_row(self, grid, new_neighbours_grid, y):
grid_row = np.zeros(GRID_WIDTH + 2)
for x in range(0, GRID_WIDTH):
xy_status = self.get_status_grid(x, y, grid, new_neighbours_grid)
grid_row[x + 1] = xy_status
return grid_row
def get_status_grid(self, x, y, new_grid, new_neighbours_grid):
current_status = new_grid[x + 1][y + 1]
living_neighbours = new_neighbours_grid[x][y]
if living_neighbours < 2 or living_neighbours > 3:
return int(0)
elif current_status == 0 and living_neighbours == 3:
return int(1)
else:
return current_status
def run
original_grid = self.grid
new_grid = original_grid
new_neighbours_grid = self.get_neighbours_grid(new_grid)
for y in range(0, GRID_HEIGHT):
grid_row = self.update_grid_row(original_grid, new_neighbours_grid, y)
new_grid[:, y + 1] = grid_row.T
self.grid = new_grid
【问题讨论】:
-
您的问题中缺少许多重要的细节。对于初学者:什么是处理每一行并生成一维数组?处理的本质是什么——它是否受计算约束?这些行和数组有多大?
-
@martineau 认为这不重要,我编辑了我的代码并添加了处理功能。该数组是一个 200x150 的整数,但它可能会增加到不超过 4000x4000 aprox。
-
你可能不会从多处理中获得太多性能,我的建议是在 numpy 中进行所有处理
-
我同意@Francisco - 使用多处理的开销很可能会超过使用它来解决这个问题所获得的任何性能。
-
正如@FranciscoCouzo 建议的那样,我使用 numpy.where(condition, trueValue, falseValue) 更改了获取状态网格以处理整行而不使用 for 循环。这将更新过程加快了 10 倍。感谢您的提示。
标签: python numpy python-multiprocessing