【发布时间】:2021-08-21 01:03:16
【问题描述】:
如果我的理解是正确的,np.sum 和np.cumsum 都需要O(n) 时间。但是,当我按顺序(在不同的轴上)对同一个矩阵执行这两种操作时,似乎np.sum 和np.cumsum 的顺序使整体性能大不相同,尽管结果与预期相同。
如果我先对每一行执行np.cumsum沿列方向(axis=1),然后对所有行执行np.sum(axis=0),则需要更长的时间。
如果我先沿行执行np.sum (axis=0),然后对一维数组执行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相同,因此您要计算 100 万个累积和,然后是 1000 个长度为 1000 的向量的总和。在您的第二个循环,首先计算 1000 个总和,然后只计算 1000 个累积总和。
标签: python arrays performance numpy