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

标签 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)

最佳答案

在 Python 中并行化两个计算绑定(bind)的 for 循环并非易事,因为有 GIL。好消息是您的案例完全可以矢量化:

def createMatrix(n):
    return 1 / (np.arange(n)[None, :] + np.arange(n)[:, None] + 1)

解释:

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

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

关于python - 并行运行两个嵌套的 for 循环以创建矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72618859/

相关文章:

java - Android:将网页的HTML读入字符串

python - numpy.transpose 是否在内存中重新排序数据?

python - comtypes 中的 COM 对象 VARIANT 参数(python)

python - 查询期间失去与 MySQL 服务器的连接

c++ - 如果分离的 std::thread 使用超出范围的对象是否安全?

java - ThreadPoolExecutor 与 ExecutorService 的服务超时用例

python - 在 Python 中创建一组向量的笛卡尔积?

python - 有没有一种 pythonic 方法来获取可迭代中相同值的簇的开始和结束索引?

python - Pygame:绘制矩形的奇怪行为

python - 用于可选匹配字符串结尾的正则表达式(可选 $)