一个简短的说明:这个问题与我之前问过的另一个问题有关,但是由于在一个问答中提出多个问题被认为是不好的 SO 风格,所以我把它分开了。
设置
我有以下两种矩阵计算的实现:
- 第一个实现使用 a
matrix of shape (n, m)
并且计算在 for 循环中重复 forrepetition
-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 中的性能:
- 第一个实现更快(在我的测试用例中,n=1000,m=1000:17 秒对 26 秒)。为什么
numpy
在三维而不是二维上工作时会这么慢?