【发布时间】:2017-06-11 19:17:55
【问题描述】:
我刚刚注意到numpy 的zeros 函数有一个奇怪的行为:
%timeit np.zeros((1000, 1000))
1.06 ms ± 29.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit np.zeros((5000, 5000))
4 µs ± 66 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
另一方面,ones 似乎具有正常行为。
有谁知道为什么用zeros 函数初始化一个小的 numpy 数组比一个大数组需要更多的时间?
(Python 3.5,numpy 1.11)
【问题讨论】:
-
那么第二个矩阵大了 25 倍,但创建时间只需要 4 倍?这令人惊讶。
-
@JamesKPolk 再读一遍,第二个较大的数组需要 4 微秒,第一个较小的数组需要 1 毫秒!我得到了类似的结果,但结果不那么极端。
-
我认为这可能是
calloc达到了一个阈值,它从操作系统请求归零内存并且不需要实际初始化它。 -
当一维数组的大小 S 从 4,150,000 变为 4,200,000 时,使用
np.zeros(S)将其归零的时间从每循环 5.5 ms 变为每循环 9.6 µs。但是,%timeit中的循环数同时从 100 变为 100,000。我的猜测是,对于一定大小及以上的数组,最慢和最快运行之间的差异变得足够大,足以触发 1000 倍以上的循环,这大大提高了测量精度并减少了报告的运行时间。不是因为它更短,而是因为它的测量更准确。 -
@DYZ 我正在使用
timeit.timeit函数,控制1000的数字,我得到0.343710215005558代表(1000,1000)和0.0028691469924524426代表(5000, 5000)