python list底层实现

列表实现可以是数组和链表。这里数值是指动态数组。

因此:
利用 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 相似,本质也是一个数组,但是空间大小固定。不同于一般数组.


参考:

  1. Python的列表(List)的底层实现原理;
  2. Python中的List对象(《Python源码剖析》笔记四);
  3. Python列表和元组的底层实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rosefunR

你的赞赏是我创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值