列表实现可以是数组和链表。这里数值是指动态数组。
因此:
利用 list.insert(i,item) 方法在任意位置插入一个元素——复杂度O(N)
利用 list.pop(i) 或 list.remove(value) 删除一个元素——复杂度O(N)
index() O(1)
append O(1)
pop() O(1)
pop(i) O(n)
insert(i,item) O(n)
del operator O(n)
iteration O(n)
contains(in) O(n)
get slice[x:y] O(k)
del slice O(n)
set slice O(n+k)
reverse O(n)
concatenate O(k)
sort O(nlogn)
multiply O(nk)
在Python的列表中,无一例外地存放的都是PyObject指针。所以实际上,我们可以这样看待Python中的PyListObject:vector<PyObject>。
显然PyListObject是一个变长对象,同时它还支持插入和删除等操作,所以它还是一个可变对象。
list 本质上是一个长度可变的连续数组。其中 ob_item 是一个指针列表,里边的每一个指针都指向列表中的元素,而 allocated 则用于存储该列表目前已被分配的空间大小。
allocated 和列表的实际空间大小不同,列表实际空间大小,指的是 len(list) 返回的结果,也就是上边代码中注释中的 ob_size,表示该列表总共存储了多少个元素。而在实际情况中,为了优化存储结构,避免每次增加元素都要重新分配内存,列表预分配的空间 allocated 往往会大于 ob_size。
newsize < allocated && newsize >allocated/2:简单调整ob_size
其他情况下重新分配内存空间
python不仅在内存不够用的时候会给PyListObject分配更多的内存,当newsize < allocated/2时,还会收缩内存空间,以达到内存利用的最大化。
tuple 和 list 相似,本质也是一个数组,但是空间大小固定。不同于一般数组.
参考: