默认情况下,numpy是按行主序存储的。因此,以下结果对我来说是自然的。
a = np.random.rand(5000, 5000)
%timeit a[0,:].sum()
3.57 µs ± 13.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit a[:,0].sum()
38.8 µs ± 8.19 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
由于是按行主序排列,使用 [0,:] 可以更快地计算。但是,如果使用 numpy 的 sum 函数,则结果会有所不同。
%timeit a.sum(axis=0)
16.9 ms ± 13.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit a.sum(axis=1)
29.5 ms ± 90.3 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
如果使用numpy sum函数,沿列计算会更快。
所以我的观点是为什么沿axis = 0(沿列计算)的速度比沿axis = 1(沿行计算)的速度更快。
例如
a = np.array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]], order='C')
在行优先(row major)排序中,[1,2,3]和[4,5,6],[7,8,9]分别被分配到相邻的内存中。
因此,沿着axis = 1计算速度应该比axis = 0更快。然而,使用numpy sum函数时,沿列(axis = 0)计算速度更快。
您如何解释这一点呢?
谢谢!
a[0,:]
只对第一行进行求和。a.sum(axis=0)
沿着行方向对整个矩阵进行求和。这两个操作计算的并不相同。 - cs95axis=1
而不是0
。此外,一个比另一个慢的原因是由于缓存未命中和局部性差。 - cs95