【发布时间】:2016-10-25 07:19:00
【问题描述】:
我的 Python 代码中目前有以下双循环:
for i in range(a):
for j in range(b):
A[:,i]*=B[j][:,C[i,j]]
(A 是浮点矩阵。B 是浮点矩阵列表。C 是整数矩阵。矩阵是指 m x n np.arrays。
确切地说,大小是: A: mxa B: b 大小为 mxl 的矩阵(每个矩阵的 l 不同) C: axb。这里m很大,a很大,b很小,l比b还要小 )
我试图通过这样做来加快速度
for j in range(b):
A[:,:]*=B[j][:,C[:,j]]
但令我惊讶的是,这表现得更糟。
更准确地说,这确实提高了 m 和 a 的小值(“大”数)的性能,但从 m=7000,a=700 开始,第一个方法的速度大约是原来的两倍。
还有什么我可以做的吗?
也许我可以并行化?但我真的不知道怎么做。
(我不致力于 Python 2 或 3)
【问题讨论】:
-
B列表中的所有浮点矩阵是否都具有相同的形状? -
另外,
*是在谈论矩阵乘法还是元素乘法?你在处理 NumPy 数组或矩阵吗? -
否(#rows 相同,#cols 不同)。但它们差别不大,所以填充不会太昂贵,如果有帮助的话
-
我正在处理元素乘法,正如问题中提到的,我正在处理 np.arrays
-
通常
B中有多少个数组,即b的典型值?
标签: python performance numpy parallel-processing vectorization