我目前正在尝试优化一段代码,其依据是我们计算并计算一堆值并将其写入矩阵。计算顺序无关紧要:
mat = np.zeros((n, n))
mat.fill(MAX_VAL)
for i in xrange(0, smallerDim):
for j in xrange(0,n):
similarityVal = doACalculation(i,j, data, cache)
mat[i][j] = abs(1.0 / (similarityVal + 1.0))
我分析了这段代码,发现大约90%的时间都花在了将值写回到矩阵中(最后一行)
我想知道进行这种类型的计算以优化写入的最佳方法是什么。我应该写入中间缓冲区并复制整行等吗?对于性能调优或numpy内部结构我还是一无所知。
编辑:doACalculation不是没有副作用的函数。它接收一些数据(假设这是一些python对象),还接收其写入和读取一些中间步骤的缓存。我不确定是否可以轻松将其向量化。我尝试按照建议使用numpy.vectorize,但没有发现天真的for循环有明显的提速。(我通过状态变量传入了其他数据):
如果可以向量化doACalculation
,任务将变得容易:
similarityArray = doACalculation(np.indices((smallerDim, n)))
mat[:smallerDim] = np.abs(1.0 / (similarityArray + 1))
假设您进行了doACalculation
正确的矢量化处理,这至少应至少快一个数量级。通常,在使用NumPy数组时,您希望尽可能避免显式循环和元素访问。
作为参考,一个可能的矢量化示例doACalculation
:
# Unvectorized
def doACalculation(i, j):
return i**2 + i*j + j
# Vectorized
def doACalculation(input):
i, j = input
return i**2 + i*j + j
# Vectorized, but with the original call signature
def doACalculation(i, j):
return i**2 + i*j + j
是的,最后一个版本实际上应该与未向量化的功能相同。有时候就是那么容易。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句