numpy 数组和 python 列表是否经过优化以动态增长?

2024-01-02

多年来我做了很多需要我使用的事情list's .append()函数,还有numpy.append()numpy 数组的函数。我注意到both当数组的大小很大时,增长非常慢。

我需要一个动态增长的数组,其大小约为 100 万个元素。我可以自己实现这个,就像std::vector http://en.cppreference.com/w/cpp/container/vector/reserve是用 C++ 编写的,通过添加无法从外部访问的缓冲区长度(保留长度)。但我必须重新发明轮子吗?我想它应该在某个地方实施。所以我的问题是:Python 中已经存在这样的东西了吗?

我的意思是说:Python中是否有一种数组类型能够随着时间复杂度动态增长O(C)大多数时候?


numpy 数组的内存在其文档中有很好的描述,并且已经在这里进行了很多讨论。还讨论了列表内存布局,尽管通常只是与 numpy 进行对比。

numpy 数组具有固定大小的数据缓冲区。 “增长”它需要创建一个新数组,并将数据复制到其中。np.concatenate在编译的代码中执行此操作。np.append以及所有stack函数使用concatenate.

据我了解,列表有一个连续的数据缓冲区,其中包含指向内存中其他位置的对象的指针。 Python 在该缓冲区中保留了一些可用空间,因此添加list.append相对快速和容易。但是当可用空间填满时,它必须创建一个新的缓冲区并复制指针。我可以看到对于大列表来说这可能会变得昂贵。

因此,列表将在内存中的其他位置存储每个元素的指针,以及元素本身(例如浮点数)。相反,浮点数组将浮点本身作为连续字节存储在其缓冲区中。 (对象数据类型数组更像列表)。

迭代创建数组的推荐方法是使用以下命令构建列表append,并在最后创建一次数组。重复np.append or np.concatenate是比较贵的。

deque被提到。我不太了解它如何存储数据。文档说它可以像在末尾一样轻松地在开头添加元素,但随机访问比列表慢。这意味着它将数据存储在某种链接列表中,以便找到nth元素需要遍历n-1之前的链接。因此,需要在增长便利性和访问速度之间进行权衡。

将元素添加到列表的开头需要创建一个新的指针列表,并将新的指针放在开头。因此,从常规列表的开头添加和删除元素比在末尾添加和删除元素要昂贵得多。

推荐软件不属于 SO 的核心目的。其他人可能会提出建议,但如果此建议被关闭,请不要感到惊讶。

有类似的文件格式HDF5这是专为大型数据集设计的。它们通过“分块”等功能来适应增长。还有各种数据库包。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

numpy 数组和 python 列表是否经过优化以动态增长? 的相关文章

随机推荐