python - 由于数组大小的微小差异,创建 numpy.zeros 的时间差异很大

标签 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。

最佳答案

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

我的电脑也遇到了同样的问题。不知道解释一下。

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

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

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

关于python - 由于数组大小的微小差异,创建 numpy.zeros 的时间差异很大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21287973/

相关文章:

python - 错误 404 - 使样式表在 Bottle 中工作(Python Web 框架)

python - 在 Docker 中运行应用程序时发现 ModuleNotFound

php - 无法访问通过 PHP 中的 Post 方法发布的数组的值

javascript - JavaScript中forEach回调函数的第三个参数是什么意思

python - rpy2 - 如何将数据帧作为 RData 文件保存到磁盘?

python 脚本需要很长时间并且窗口似乎卡住

java - 使用 byte[] 的部分内存效率更高的方法是什么?

python - 如何将不同的数组一起写入文件

python - 打印 Pandas 数据框时抑制描述性输出

python - 重新排序 numpy ndarray 的最后一个维度