1

一个简短的说明:这个问题与我之前问过的另一个问题有关,但是由于在一个问答中提出多个问题被认为是不好的 SO 风格,所以我把它分开了。


设置

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

  1. 第一个实现使用 amatrix of shape (n, m)并且计算在 for 循环中重复 for repetition-times:
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


问题

关于这两种实现,我发现了它们%timeit在 iPython 中的性能:

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

0 回答 0