python数据类型的性能--算法复杂度

python两种内置数据类型上各个操作的大O数量级

列表list和字典dict

对比list和dict的操作

3cb961fb8a77175f54a667327ee5d62f.jpeg

80/20准则:80%的功能其使用率只有20%

所以越常用的功能,优化的越好,性能就越好

list列表数据类型常用的操作性能

最常用的是:按索引取值和赋值(v=a[i],a[i]=v)

由于列表的随机访问的特性,这两个操作执行的时间与大小无关,均为O(1)

列表增长:可以选择append()+

lst.append(v),执行时间是O(1)
lst=lst+[v],执行时间是O(n+k),其中k是被加的列表长度

我们来举个例子如何计算性能

下面是4种生成n个列表的方法

  1. 循环连接列表(+)方式生成
  2. append方法添加元素生成
  3. 列表推导式
  4. range函数调用转成列表
def text1():
    # 1. 循环连接列表(+)方式生成
    l = []
    for i in range(1000):
        l=l+[i]

def text2():
    # 2. append方法添加元素生成
    l=[]
    for i in range(1000):
        l.append(i)

def text3():
    # 3. 列表推导式
    l=[i for i in range(1000)]

def text4():
    # 4. range函数调用转成列表
    l = list(range(1000))

我们分别运行这些函数,并计时

这里使用timeit模块来对其计时

代码如下:

from timeit import Timer
def text1():
    # 1. 循环连接列表(+)方式生成
    l = []
    for i in range(1000):
        l=l+[i]

def text2():
    # 2. append方法添加元素生成
    l=[]
    for i in range(1000):
        l.append(i)

def text3():
    # 3. 列表推导式
    l=[i for i in range(1000)]

def text4():
    # 4. range函数调用转成列表
    l = list(range(1000))


if __name__ == "__main__":
    t1 = Timer('text1()','from __main__ import text1')
    print('text1. %f s'% t1.timeit(number=1000))
    t2 = Timer('text2()','from __main__ import text2')
    print('text2. %f s'% t2.timeit(number=1000))
    t3 = Timer('text3()','from __main__ import text3')
    print('text3. %f s'% t3.timeit(number=1000))
    t4 = Timer('text4()','from __main__ import text4')
    print('text4. %f s'% t4.timeit(number=1000))

这里是把每个函数都运行了1000次并计时

运行结果:

text1. 2.097764 s
text2. 0.114630 s
text3. 0.061288 s
text4. 0.022224 s

这里可以清楚的看到,这四种方法运行时间的差距还是比较大的 最慢的是text1函数,用的是循环连接列表(+)方式生成 最快的是text4函数,用的是range函数调用转成列表生成

List基本操作的大O数量级


10a476c124879302416fdf453a3b1fbb.jpeg


Dict基本操作的大O数量级


21a3b6df17afbbdb6ffc79034e1aeaeb.jpeg


python官方的算法复杂度网站

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值