python的list和tuple

列表是python中简单而重要的数据结构

list_sample = [1, 2, 3]

 

超预分配的量大概只有总量的八分之一,保证不太浪费的情况下,也有线性的摊分复杂度。

new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6)

 

当增加或删除都有可能引起allocated的变化,当目前的allocated满足

allocated >= newsize && newsize >= (allocated >> 1)

这个关系时,allocated不变,不然更新分配值

allocated = new_allocated + newsize

 

由于python列表中的元素可以是任意的对象。

在底层实现上,由于对象大小未知,并不能像数组那样连续排在内存里。

python列表维护了一个指针数组,每个指针指向不同的对象,

这也造成了一些弊端,例如列表中对象大小一样的时候就很亏了,浪费空间不说,

跟C的数组相比,它离散的对象位置不能很好地利用CPU高速缓存,造成了遍历需要更多的CPU周期。

当然也有优点,例如在某个位置insert一个新的元素时,只要挪动部分指针的值就OK了。

 

一些操作的时间复杂度:

append:O(len(append_str))

insert:O(len(str) + len(insert_str))

 

tuple与list有什么区别?最重要的区别就是tuple是immutable,而list是mutable,

那么也就是说tuple大小将不会改变,就不用像list那样搞预分配了,更节省内存。

 

很多人说tuple比list快,真的如此吗?

size = 1000000

a = []
for i in xrange(0, size):
    a.append(i)
b = tuple(a)

for t in xrange(0, 32):
    sum = 0
    for e in b:
        sum += e

分别遍历list和tuple,跑得的时间是6.925s和6.771s

从实测看来,这个结论是不明显的。

 

list和tuple在c实现上是很相似的,对于元素数量大的时候,

都是一个数组指针,指针指向相应的对象,找不到tuple比list快的理由。

但对于小对象来说,tuple会有一个对象池,所以小的、重复的使用tuple还有益处的。

 

为什么要有tuple,还有很多的合理性。

实际情况中的确也有不少大小固定的列表结构,例如二维地理坐标等;

另外tuple也给元素天然地赋予了只读属性。

 

认为tuple比list快的人大概是把python的tuple和list类比成C++中的数组和列表了。

 

参考

python源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值