Jan*_*cka 3 python performance numpy
在对numpy数组中的维求和时,第一个轴与最后一个轴之间是否存在性能差异?
具体来说,考虑以下代码,哪一个sum1和哪个sum2将执行得更快?
import numpy as np
a = np.ones((1000,200))
b = np.ones((200,1000))
sum1 = np.sum(a, axis=0)
sum2 = np.sum(b, axis=-1)
Run Code Online (Sandbox Code Playgroud)
我相信这个问题实际上可以归结为numpy如何在内部存储维度,可以使用行或列格式来覆盖它。但是,使用默认设置时,哪个更快?另外,N维数组呢?
检查是否存在性能差异非常容易(IPython,我增加了一些数字以使差异更明显):
import numpy as np
a = np.ones((10000, 2000))
b = np.ones((2000, 10000))
%timeit np.sum(a, axis=0)
# 27.6 ms ± 541 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit np.sum(b, axis=-1)
# 34.6 ms ± 876 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
Run Code Online (Sandbox Code Playgroud)
现在,当您遇到实际性能问题np.sum时,无论如何,内存可能会用完,但是是的,两者有所不同。默认情况下,NumPy数组以行优先顺序存储,因此第一行进入第一行,然后第二行,依此类推。然后,在外部维度上求和(或操作)确实更快,因为缓存将更加有效。简而言之,在第一种情况下,当您获得数组的第一个元素时,一堆连续的数据将与之一起进入缓存,因此,当您想对下一个元素求和时,它们将已经存在。另一方面,在第二种情况下,要求和的元素彼此之间相距很远(实际上是2000个距离元素),因此缓存在列方面不会有多大帮助。这并不是说缓存根本无济于事,因为您要对所有列进行求和,因此缓存的数据仍会在一定程度上被重用,但效率不高。这是一个大致的近似值,通常有几种缓存级别,有些在内核之间共享,有些则不,
| 归档时间: |
|
| 查看次数: |
1102 次 |
| 最近记录: |