我的回答并不完全适合您的问题,但在您阅读本文后,我希望您能够决定您需要选择哪种类型来满足您的需求。
Python 的列表是变长数组 http://en.wikipedia.org/wiki/Variable-length_array,而不是 Lisp 风格的链表。该实现使用对其他对象的引用的连续数组,并保留指向该数组的指针。
这使得索引列表 a[i] 成为一种操作,其成本与列表的大小或索引的值无关。
当附加或插入项目时,引用数组的大小将被调整。
应用一些算法来提高重复追加项目的性能;
当数组必须增长时,会分配一些额外的空间,因此接下来的几次
不需要实际调整大小,即过度分配。更多信息 https://github.com/python-git/python/blob/master/Objects/listobject.c
删除、弹出、删除:
乍一看,他们似乎都在做同样的事情。
在引擎盖下它的行为有所不同。
removing https://github.com/python-git/python/blob/master/Objects/listobject.c#L2312:从列表中删除一个元素,从 0 索引迭代到第一个
找到该元素的匹配项。如果元素位于末尾,则需要更多时间进行迭代。
pop https://github.com/python-git/python/blob/master/Objects/listobject.c#L916:使用索引从列表中删除元素。花费更少的时间。
del: 是一个 python 语句,用于从名称空间或项目中删除名称
从字典中获取,或使用索引从列表中获取项目。
REMOVE:
- 它删除了第一次出现的值。
- 如果值不存在,则引发 ValueError。
- 它只需要一个参数,因此您无法一次性删除多个值。
POP:
- 删除并返回索引处的项目(默认为最后)。
- 如果列表为空或索引超出范围,则引发 IndexError。
- 它只需要一个参数,因此您无法一次性删除多个值。
DEL:
- 删除索引处的项目并且不返回任何内容。
- 它可以从列表中删除切片或可以清除整个列表。
基准:
最坏的情况:从列表末尾删除。
yopy:-> python -m timeit "x=range(1000)" "x.pop(999)"
100000 loops, best of 3: 10 usec per loop
yopy:-> python -m timeit "x=range(1000)" "x.remove(999)"
10000 loops, best of 3: 31.3 usec per loop
yopy:-> python -m timeit "x=range(1000)" "del x[999]"
100000 loops, best of 3: 9.86 usec per loop
yopy:->
最好的情况:列表的开头。
yopy:-> python -m timeit "x=range(1000)" "x.remove(1)"
100000 loops, best of 3: 10.3 usec per loop
yopy:-> python -m timeit "x=range(1000)" "x.pop(1)"
100000 loops, best of 3: 10.4 usec per loop
yopy:-> python -m timeit "x=range(1000)" "del x[1]"
100000 loops, best of 3: 10.4 usec per loop
yopy:->
需要注意的一点:
如果数组在中间增大或缩小
- 重新分配仍然取决于总长度。
- 但是,所有尾随元素都必须复制
所以,现在我希望你能决定你需要选择什么来满足你的需求。