python数据类型的性能

python 数据类型的性能

在python语法精讲中我们讲了python基础数据类型,这里我们来讨论下python两种内置数据类型在各种操作上的时间空间复杂度。

  • 列表 list
  • 字典 dict
类型listdict
索引自然数ikey
添加append、extend、insertD[key]=v
删除pop、removepop
更新ls[i] =vD[key]=v
正查ls[i]、ls[i:j]D[key]、copy
反查index(v)、count(v)没有
其它reverse、sorthas_key、update

列表常用操作

由于列表的随机访问特性,

  • var = ls[i] 和 ls[i] = v 这两个操作的执行时间与列表大小无关,均为O(1);
  • ls.append(v)执行时间是O(1)
  • ls = ls + [ls_1] 执行时间是O(n+k)

生成列表的4个方法

def test_1():
    l = []
    for i in range(1000):
        l = l + [i]

def test_2():
    l = []
    for i in range(1000):
        l.append(i)

def test_3():
    l = [i for i in range(1000)]

def test_4():
    l = list(range(1000))

使用timeit模块对函数计时

from timeit import Timer

t1 = Timer('test_1()','from __main__ import test_1')
print('concat %f s\n' % t1.timeit(number=1000))

t2 = Timer('test_2()','from __main__ import test_2')
print('append %f s\n' % t2.timeit(number=1000))

t3 = Timer('test_3()','from __main__ import test_3')
print('comprehension %f s\n' % t3.timeit(number=1000))

t4 = Timer('test_4()','from __main__ import test_4')
print('list %f s\n' % t4.timeit(number=1000))
输出结果:
concat 1.138047 s
append 0.049819 s
comprehension 0.028476 s
list 0.012456 s

列表基本操作的复杂度

操作复杂度
index[ ]O(1)
appendO(1)
popO(1)
pop(i)O(n)
insert(i)O(n)
sortO(n log n)

我们可以看到pop这两种操作的复杂度差别非常的大。原因在于,从中部移除元素的话,要把移除元素后面的元素全部向前挪位复制一遍,这种方法保证列表按索引取值和赋值操作很快,是O(1)。
有兴趣的可以用上面的方法来验证一下pop指令的两种删除的操作复杂度;

ls = list(range(10000))
pop_one = timeit.Timer('ls.pop(1)', 'from __main__ import ls')
print('%f s\n' % pop_one.timeit(number=1000))
pop_end = timeit.Timer('ls.pop()', 'from __main__ import ls')
print('%f s\n' % pop_end.timeit(number=1000))

字典数据类型

字典与列表不同,字典是根据键(key)来获取数据项的。
所以字典存入数据和查找数据都是O(1);判断是否在dict.keys()(是否在字典的键中)的操作也是O(1)复杂度。
字典中的数据的存储是无序的。

python官方的算法复杂度网站

python官方的算法复杂度https://wiki.python.org/moin/TimeComplexity
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

他是只猫

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值