如果我的理解是正确的,无论是
如果我首先沿着列方向(
如果我首先沿着行方向(
我的假设是,由于
以下是我的测试代码和结果
结果是:
np.sum
还是np.cumsum
都需要O(n)
的时间。然而,当我在同一矩阵上按顺序执行这两个操作(在不同的轴上),尽管结果如预期,但np.sum
和np.cumsum
的顺序似乎使整体性能有所不同。如果我首先沿着列方向(
axis=1
)对每一行执行np.cumsum
,然后对所有行(axis=0
)执行 np.sum
,需要更长的时间。如果我首先沿着行方向(
axis=0
)执行np.sum
,然后对一维数组执行np.cumsum
,需要更短的时间。我的假设是,由于
np.cumsum
产生的数据比np.sum
多,因此在有更多np.cumsum
操作时需要更多的数据分配/操作时间,所以需要更长的时间。以下是我的测试代码和结果
import numpy as np
import time
b = np.zeros((1000, 1000))
for i in range(1000):
b[i] = np.array(range(1000))
time_start = time.time()
for i in range(1000):
c = np.cumsum(b, axis=1)
d = np.sum(c, axis=0)
time_end = time.time()
print(f"np.sum(np.cumsum(...)) time: {time_end - time_start}")
time_start = time.time()
for i in range(1000):
c = np.cumsum(np.sum(b, axis=0))
time_end = time.time()
print(f"np.cumsum(np.sum(...)) time: {time_end - time_start}")
结果是:
np.sum(np.cumsum(...)) time: 3.6612446308135986
np.cumsum(np.sum(...)) time: 0.38796162605285645
c
的形状为(1000, 1000)
,和b
相同,所以你正在计算一百万个累积和,然后计算长度为1000的向量的1000个总和。在第二个循环中,你先计算1000个总和,然后只计算1000个累积和。 - Andrew Eckart