【问题标题】:How to Parallelize Array Creation?如何并行化数组创建?
【发布时间】:2020-05-17 00:02:16
【问题描述】:

我有以下算法:

  1. 遍历二维数组中的所有行:
  2. 对于每个已处理的行,我得到一维数组
  3. 用处理后的一维数组替换其他二维数组的行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


【解决方案1】:

正如 cmets 中指出的那样,多处理可能没有用,但请注意,您的邻居计数对应于将您的网格与数组进行卷积

1 1 1
1 0 1
1 1 1

因此,使用 scipy.signal.convolve2d 会为您带来 10 到 100 倍的收益。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 2021-12-13
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    相关资源
    最近更新 更多