列表的数据存储与操作

测试列表的操作append和insert的效率:

#!/usr/bin/env python
# -*- coding:utf-8 -*- 
# Author: json_steve


def test_append():
    li = []
    for i in range(1000):
        li.append(i)


def test_insert():
    li = []
    for i in range(1000):
        li.insert(0, i)

from timeit import Timer
timer = Timer('test_append()', 'from __main__ import test_append')
print(timer.timeit(10000))
print('----------------------------------------------------------------')
timer1 = Timer('test_insert()', 'from __main__ import test_insert')
print(timer1.timeit(10000))


结果:

1.1129768738528019
----------------------------------------------------------------
4.213525822249263

为什么同时插入操作,时间相差很多,查找list操作的时间复杂度:append的时间复杂度用大O表示是O(1),insert()的时间复杂度是O(n),所以不同但是为什么呢?

在python 中的list和tuple都是顺序表,在元素存储区的方法是元素外置的,表头是分离式的。

插入时,假设没有超过元素的上线,也就是先不考虑扩容的情况: 如果在尾部插入,那么根据表头记录的元素个数,找到尾部(不用遍历),然后直接插入就可以了,所以时间频度就是1,渐进函数也是1,大O表示也是O(1)。但是如果要插入列表的起始位置,那么所有的原始元素都需要向尾部退后一位,这就需要遍历所有元素,假设元素有n个,所以时间频度就是n,渐进函数也是n,大O表示O(n)。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值