创建numpy.zeros的巨大时差,因为数组的大小差异很小

时间:2014-01-22 16:06:06

标签: python arrays numpy

我试图确定执行numpy.zeros的时间复杂度,因此我运行了以下测试。它似乎与你正在创建的数组的大小呈线性关系,但在某个时刻,它需要花费多少时间。以下是一些有趣的案例,其中几乎不改变数组大小会将创建时间改变一个数量级

python -m timeit -n 1000 -s "import numpy" "numpy.zeros(64500, dtype=float)"
10000 loops, best of 3: 33.5 usec per loop


python -m timeit -s "import numpy" "numpy.zeros(65000, dtype=float)"
1000 loops, best of 3: 418 usec per loop

这是巨大的差异!在大小为64500的阵列下方,时间复杂度与阵列大小大致呈线性关系,高于大小为65000的阵列,时间复杂度大致呈线性。 为什么这里有如此惊人的时差?

我的理解是内部Python将所有内容存储在自己的特殊堆中。这是因为numpy使用C,它在C堆栈上存储一定大小的数组,在C堆上存储另一个大小的数组?我甚至不确定这个问题是否有意义。

我在Windows 7机器上使用32位python 3.3.1和numpy 1.7.0rc1。

2 个答案:

答案 0 :(得分:1)

The x axis is log(i), the y axis is the time/i

我在计算机上遇到了同样的问题。不知道要解释。

我绘制了时间除以数组的长度,因此,如果时间复杂度是线性的,则应该保持不变。

该图是10次运行的平均值,因此每次试验中都会出现高峰值

(x轴上的数字是数组大小的对数,y是以秒为单位的时间除以数组大小)

答案 1 :(得分:0)

我已在计算机上运行您的代码。在两个不同的实验中,每个循环几乎是同一时间,这不是针对堆栈/堆问题,因为内存位置可能会相同,我认为它可能是内存问题。我的电脑内存是16GB。