【发布时间】:2014-01-13 16:46:21
【问题描述】:
我目前正在尝试优化一段代码,其要点是我们通过计算一堆值并将它们写入矩阵。计算顺序无关紧要:
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 循环有显着的加速。 (我通过状态变量传入了附加数据):
【问题讨论】:
-
试试
numpy.vectorize -
doACalculation是什么? -
作为一般评论,使用
mat[i,j]而不是mat[i][j]可以获得更好的性能,但与使用numpy 广播和ufunc 相比,这种改进会很小。
标签: python performance optimization numpy matrix