并行运行两个嵌套 for 循环以创建矩阵

ort*_*noa 2 python multithreading numpy

我编写了一个方法,它接受整数“n”并创建一个方阵,其中每个元素的值由它们各自的 i,j 索引决定。

当我构建一个 30x30 的小矩阵时,它工作得很好,但是当我尝试做一些更大的矩阵(例如 1000x1000)时,它需要很长时间。有什么方法可以通过多处理来加快速度吗?

def createMatrix(n):
    matrix = []
    for j in range(1,n+1):
        row = []
        for i in range(1,n+1):
            value = 1/(i+j-1)
            row.append(value)
        matrix.append(row)
    return np.array(matrix)
Run Code Online (Sandbox Code Playgroud)

Mar*_*rat 6

由于 GIL,在 Python 中并行化两个计算密集型for循环并非易事。好消息是你的情况是完全可矢量化的:

def createMatrix(n):
    return 1 / (np.arange(n)[None, :] + np.arange(n)[:, None] + 1)
Run Code Online (Sandbox Code Playgroud)

解释:

  • 本质上,矩阵的公式是X[row][column] = 1/(row+column-1),其中行和列从 1 开始
  • np.arange(n)创建可用于行或列的范围
  • [None, :]并将[:, None]其转换为二维数组,1 x n或者n x 1
  • numpy然后广播维度,复制行和列索引以匹配维度 - 因此,n x n在添加时隐式地将两者平铺到其中
  • 因为两个范围都是从 0 开始的,所以使用+1而不是-1

根据经验,在 numpy 数组上使用 for 循环几乎从来都不是一个好主意。矢量化方法(即矩阵形式计算)的速度要快几个数量级。