【发布时间】:2018-07-06 09:54:13
【问题描述】:
我正在做一些计算,并测量了 ufuncs(如 np.cumsum)在不同轴上的性能,以提高代码的性能。
In [51]: arr = np.arange(int(1E6)).reshape(int(1E3), -1)
In [52]: %timeit arr.cumsum(axis=1)
2.27 ms ± 10.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [53]: %timeit arr.cumsum(axis=0)
4.16 ms ± 10.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
cumsum 在轴 1 上的速度比cumsum 在轴 0 上的速度几乎 2 倍。为什么会这样?幕后发生了什么?很高兴能清楚地了解其背后的原因。谢谢!
更新:经过一番研究,我意识到如果有人正在构建一个应用程序,他们总是sum只在某个轴上,那么数组应该初始化为适当的顺序:即 C-order 用于轴 = 1 总和或 Fortran 顺序 用于轴 = 0 总和,以节省 CPU 时间。
另外:difference between contiguous and non-contiguous arrays 上的这个出色回答帮助很大!
【问题讨论】:
-
我的机器上的对比度更大。我可以想象逐行求和对缓存更友好。
-
@cᴏʟᴅsᴘᴇᴇᴅ 很可能,因为我在集群上尝试这个:)。此外,不仅
sum几乎所有可以在轴上减少的 ufunc 的行为方式都相同
标签: python performance numpy numpy-ufunc numpy-ndarray