哪个更快,numpy转置或翻转指数?

时间:2013-01-28 20:21:02

标签: python performance numpy transpose

我有一个动态编程算法(修改过的Needleman-Wunsch),它需要两次相同的基本计算,但计算是在第二次正交方向上完成的。例如,从矩阵 scoreMatrix 中的给定单元格(i,j),我想要从(i,j)中的值“up”计算值),以及从值到(i,j)的“左”的值。为了重用代码我使用了一个函数,在第一种情况下我发送参数 i,j,scoreMatrix ,在下一种情况下我发送 j,i,scoreMatrix .transpose()的。以下是该代码的高度简化版本:

def calculateGapCost(i,j,scoreMatrix,gapcost):
  return scoreMatrix[i-1,j] - gapcost

...
gapLeft = calculateGapCost(i,j,scoreMatrix,gapcost)
gapUp = calculateGapCost(j,i,scoreMatrix.transpose(),gapcost)
...

我意识到我可以选择发送一个函数,在一个案例中,当从 scoreMatrix 中检索一个值时,会通过参数(i,j)另一种情况是将它们反转为(j,i),而不是每次都转置矩阵。

def passThrough(i,j,matrix):
  return matrix[i,j]

def flipIndices(i,j,matrix):
  return matrix[j,i]

def calculateGapCost(i,j,scoreMatrix,gapcost,retrieveValue):
  return retrieveValue(i-1,j,scoreMatrix) - gapcost

...
gapLeft = calculateGapCost(i,j,scoreMatrix,gapcost,passThrough)
gapUp = calculateGapCost(j,i,scoreMatrix,gapcost,flipIndices)
...

然而,如果numpy转置使用了一些我不知道只在几个操作中进行转置的功能,那么转置实际上可能比我的传递函数想法更快。任何人都可以告诉我哪个会更快(或者如果有更好的方法我没有想过)?

实际方法将调用 retrieveValue 3次,并涉及2个将被引用的矩阵(如果使用该方法则转换)。

1 个答案:

答案 0 :(得分:9)

在NumPy中,转置会返回具有不同形状和strides的视图。它不会触及数据。

因此,您可能会发现这两种方法具有相同的性能,因为实质上它们完全相同。

然而,唯一可以肯定的方法是对两者进行基准测试。