Python列表内存重新分配问题

时间:2016-11-10 07:14:22

标签: python python-2.7 list

如果我正在使用C-Python或jython(在Python 2.7中)和list[])数据结构,如果我继续添加新元素,是否会出现内存重新分配问题Java ArrayList如何(由于Java ArrayList需要连续的内存空间,如果当前预分配的空间已满,它需要重新分配新的更大的连续大内存空间,并将现有元素移动到新分配的空间)?

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#ArrayList.ensureCapacity%28int%29

的问候, 林

2 个答案:

答案 0 :(得分:2)

至少对于主要的Python来说,基本的故事是​​列表包含指向内存中其他对象的指针。该列表是使用一定的空闲空间创建的(例如,用于8个指针)。当它填满时,它会分配更多内存,依此类推。它是否将指针从一个内存块移动到另一个内存块,是大多数用户忽略的细节。在实践中,我们只需根据需要附加/扩展列表,而不用担心内存使用。

Why does creating a list from a list make it larger?

我认为jython使用相同的方法,但您必须深入研究其代码,看看它是如何转换为Java的。

我主要回答numpy个问题。这是一个创建固定大小的多维数组的数字包。如果用户需要逐步构建这样的数组,我们通常建议他们以列表开头并附加值。最后他们创建了数组。附加到列表比多次重建数组要便宜得多。

答案 1 :(得分:1)

内部python列表是hpaulj

提到的指针数组

接下来的问题是如何在answer中解释如何在C中扩展数组。这解释了这可以使用C中的realloc函数来完成。

这引导我查看提及

realloc的行为
  

该函数可以将内存块移动到一个新位置(该函数返回其地址)。

据我所知,如果连续内存可用,则数组对象扩展,否则将内存块(包含Array对象而非List对象)复制到新分配的更大内存块。 < / p>

这是我的理解,如果我错了,欢迎更正。