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)
由于 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 1numpy然后广播维度,复制行和列索引以匹配维度 - 因此,n x n在添加时隐式地将两者平铺到其中+1而不是-1根据经验,在 numpy 数组上使用 for 循环几乎从来都不是一个好主意。矢量化方法(即矩阵形式计算)的速度要快几个数量级。