在NumPy中,更快地创建更大的数组?

时间:2016-12-13 11:34:38

标签: python arrays numpy caching timeit

这是一个缓存的东西,正如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

1 个答案:

答案 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