这是一个缓存的东西,正如timeit建议的那样?
In [55]: timeit a = zeros((10000, 400))
100 loops, best of 3: 3.11 ms per loop
In [56]: timeit a = zeros((10000, 500))
The slowest run took 13.43 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 3.43 µs per loop
试图欺骗它,但它没有工作:
In [58]: timeit a = zeros((10000, 500+random.randint(100)))
The slowest run took 13.31 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 4.35 µs per loop
答案 0 :(得分:2)
原因不是缓存,而是numpy只创建占位符而不是完整数组。通过在执行以下操作时监视RAM使用情况,可以轻松验证这一点:
a = np.zeros((20000, 20000), np.float64)
这不会在我的计算机上分配20k * 20k * 8byte~3GB(但可能依赖于操作系统,因为np.zeros
使用C函数calloc
)。但要小心,因为此阵列上的大多数操作(例如a += 5
)将立即分配该内存!确保使用与RAM相比适当的大小,这样您就可以注意到RAM增加而不会过度使用它。
最后,这只是推迟了数组的分配,一旦你使用它,分配和操作的组合时间应该如预期的那样(与元素数量成线性关系)。看来你正在使用IPython,所以你可以使用块时间%%timeit
:
%%timeit
a = np.zeros((10000, 400))
a += 10
# => 10 loops, best of 3: 30.3 ms per loop
%%timeit
a = np.zeros((10000, 800))
a += 10
# => 10 loops, best of 3: 60.2 ms per loop