【发布时间】:2022-11-22 23:23:57
【问题描述】:
我想知道与按列执行操作相比,迭代数组的前两个维度是否明显更慢。令我惊讶的是,如果发现按元素进行操作实际上更快。有人可以解释吗?
这是代码:
def row_by_row(arr, cop):
for i in range(arr.shape[0]):
for ii in range(arr.shape[1]):
arr[i, ii] = cop[i, ii].copy()
return arr
def all(arr, cop):
for i in range(arr.shape[1]):
arr[:,i] = cop[:, i].copy()
return arr
print(timeit.timeit("row_by_row(arr, cop)", setup= "arr = np.ones((26, 15, 5000)); cop = np.random.random((26, 15,5000))",number=50, globals=globals()))
print(timeit.timeit("all(arr, cop)",setup= "arr = np.ones((26, 15, 5000)); cop = np.random.random((26, 15,5000))", number=50, globals=globals()))
这是时间:
0.12496590000000007
0.4989047
【问题讨论】:
-
我有 python-3.10.6 和 numpy-1.21.5。我无法重现它。第二个对我来说更快。 0.104 对 0.097。快不了多少,但绝对不会慢。
-
对我来说也非常接近结果
-
诡异的。我有 python:3.9 和 numpy: 1.23.3。有时第二个更快,但大多数情况下它在帖子中。更奇怪的是,当我将第一个维度增加到 2000 时,第二个维度甚至更慢。
-
差异太小,无法得出任何稳定的结论。您应该增加大小以获得更可靠的计时。
-
我同意其他 cmet 的观点,即第二个更快 - 在我的情况下(python 3.7.7,numpy 1.18.5)第一个大约 200-300ms,第二个大约 130-200ms。另外我想注意到
.copy()完全没用,如果您已经设置了一些列,它会自动将数据复制到那里。删除它可以将两次(但尤其是第二次)时间显着降低到第一次 150-250 毫秒和第二次 60-130 毫秒。
标签: python arrays algorithm numpy