性能随着数组元素嵌套的增加而降低

时间:2019-07-16 10:30:54

标签: python numpy numpy-ndarray numpy-slicing

简短说明:该问题与another I asked previously有关,但是由于在单个问答中提出多个问题被认为是不好的SO风格,因此我将其拆分。


设置

我有以下两种矩阵计算实现:

  1. 第一个实现使用matrix of shape (n, m),并且在for循环中重复计算repetition次:
import numpy as np


def foo():
    for i in range(1, n):
        for j in range(1, m):

            _deleteA = (
                        matrix[i, j] +
                        #some constants added here
            )
            _deleteB = (
                        matrix[i, j-1] +
                        #some constants added here
            )
            matrix[i, j] = min(_deleteA, _deleteB)

    return matrix

repetition = 3
for x in range(repetition):
    foo()


2.第二种实现方式避免了额外的for循环,因此将repetition = 3包含在矩阵中,该矩阵即为shape (repetition, n, m)的矩阵:

def foo():
    for i in range(1, n):
        for j in range(1, m):

            _deleteA = (
                        matrix[:, i, j] +
                        #some constants added here
            )
            _deleteB = (
                        matrix[:, i, j-1] +
                        #some constants added here
            )
            matrix[:, i, j] = np.amin(np.stack((_deleteA, _deleteB), axis=1), axis=1)

    return matrix


问题

关于这两种实现,我发现它们与iPython中%timeit的性能有关。

  1. 第一个实现更快(在我的测试用例中,n = 1000,m = 1000:17秒vs. 26秒)。 为什么numpy在三维而不是二维上这么慢?

0 个答案:

没有答案
相关问题