【发布时间】:2016-11-10 07:14:21
【问题描述】:
如果我使用 C-Python 或 jython(在 Python 2.7 中),并且对于 list ([]) 数据结构,如果我继续添加新元素,是否会出现内存重新分配问题,例如 Java ArrayList 有(由于Java ArrayList需要连续内存空间,如果当前预分配空间已满,则需要重新分配新的更大的连续大内存空间,并将现有元素移动到新分配的空间)?
问候, 林
【问题讨论】:
-
Cpython 列表实现为数组列表,但 append 是摊销的常数时间。见here。
-
如果你会读 C,你应该看看 CPython 源代码listobject.c。保存指向 Python 列表项的指针的结构成员是
ob_item。当列表增长时,ob_item可以重新分配,并且旧项目被复制,但这是在 C 级别发生的,所以速度很快。当然,Python 列表对象本身的内存位置不会受到影响。 -
@juanpa.arrivillaga,读后混淆了
amortized这里的意思,你能再澄清一下吗? -
@PM2Ring,如果由于找不到连续的内存块而无法进行扩展,则执行重新分配的繁重操作 - 即移动到新位置需要
O(n)时间(@ 987654330@是列表中的元素个数)? -
正如我之前所说,任何所需的复制都发生在 C 级别,因此它比 Python
for循环快得多。请记住,现代 CPU 具有用于复制数组的高效操作码。
标签: python python-2.7 list