Python 中的 del a[0] 会复制整个列表吗?
Will del a[0] in Python copy the whole list?
我正在尝试使用带有 del a[0]
的简单列表来模仿 deque.popleft()
。只想了解 Python 中的 del
是如何工作的。例如:
a = [0,1,2,3,4,5]
a
在内存中连续space。在我调用 del a[0]
之后,Python 会分配新的 space 并在那里复制 1,2,3,4,5
,或者它只会给 a
一个新地址(与 a = a[1:]
).
如果分配newspace,是不是表示del a[0]
是一个_O(len(a)_操作?
如果del a[0]
与a = a[1:]
相同,Python是否会回收数组中删除的内存space?
看到这个答案:How is Python's List Implemented?
Python 列表本质上是指针数组。因此,虽然从前面删除会将整个列表中的所有元素洗牌到同一内存中的新位置 space,但如果每个元素实际存储在列表中,整个列表会比您预期的要小得多,因此,就恒定时间成本而言,洗牌速度要快得多。
但可以肯定的是,del a[0]
是一个 O(len(a)) 操作,这就是 deque
存在的原因。
在内存重新分配方面,有趣的是元素删除并不一定意味着元素的内存 space 立即被释放。列表的大小将达到特定阈值 increase/reduce 以提高内存分配请求的效率,并针对内存碎片进行优化。
编辑: This blog post explains in more details
说明:之前post并没有说明整个list的内存位置是一样的,只是每个元素都打乱了,可能一些内存被释放。
我正在尝试使用带有 del a[0]
的简单列表来模仿 deque.popleft()
。只想了解 Python 中的 del
是如何工作的。例如:
a = [0,1,2,3,4,5]
a
在内存中连续space。在我调用 del a[0]
之后,Python 会分配新的 space 并在那里复制 1,2,3,4,5
,或者它只会给 a
一个新地址(与 a = a[1:]
).
如果分配newspace,是不是表示del a[0]
是一个_O(len(a)_操作?
如果del a[0]
与a = a[1:]
相同,Python是否会回收数组中删除的内存space?
看到这个答案:How is Python's List Implemented?
Python 列表本质上是指针数组。因此,虽然从前面删除会将整个列表中的所有元素洗牌到同一内存中的新位置 space,但如果每个元素实际存储在列表中,整个列表会比您预期的要小得多,因此,就恒定时间成本而言,洗牌速度要快得多。
但可以肯定的是,del a[0]
是一个 O(len(a)) 操作,这就是 deque
存在的原因。
在内存重新分配方面,有趣的是元素删除并不一定意味着元素的内存 space 立即被释放。列表的大小将达到特定阈值 increase/reduce 以提高内存分配请求的效率,并针对内存碎片进行优化。
编辑: This blog post explains in more details
说明:之前post并没有说明整个list的内存位置是一样的,只是每个元素都打乱了,可能一些内存被释放。