数据结构与算法python第六天

python数据类型的性能(下)

List.pop的计时实验

  • 操作:pop( )从列表末尾移除元素, O(1)
  • 操作:pop(i)从列表中移除元素, O(n)

Python所选择的实现方法

从中间移除元素,要把移除元素后面的元素全部向前挪位复制一遍,看起来笨拙,这种方法能够保证按索引取值赋值的操作很快,达到O(1),这也是一种对常用和不常用操作的折衷方案

两种情况下的pop操作来实际计时对比

  • 相对同一个大小的List,分别调用pop( )和pop(0)
  • 对不同大小的List做计时时,期望的结果是
    · pop( )的时间不随list大小变化,pop(0)的时间随着list变大而变长
import timeit
popzero = timeit.Timer("x.pop(0), "from __main__ import x")
popend = timeit.Timer("x.pop( )", "from __main__ import x")

List计时实验

  • 对比

通过列表的大小来测试两个操作的增长趋势

import timeit
popzero = timeit.Timer("x.pop(0)", "from __main__ import x")
popend = timeit.Timer("x.pop( )", "from __main__ import x")
print("pop(0),pop( )")
for i in range(1000000,100000001,1000000):
    x = list(range(i))
    pt = popend.timeit(number=1000)
    x= list(range(i))
    pz = popzero.timeit(number=1000)
    print("%15.5f, %15.5f" %(pz.pt)
  • 运行数据
    在这里插入图片描述

Dict数据类型

  • 字典是关键码(key)找到数据项,列表是根据位置(index)
    · 最常用取值get()和赋值set(),性能为O(1),另外一个重要操作contains(in)是判断字典中是否存在某个关键码(key),这个性能也是O(1)
  • 操作大O数量级
    copyO(n)
    get itemO(1)
    set itemO(1)
    delete itemO(1)
    contains(in)O(1)
    iterationO(n)

list和dict的in操作符

  • 设计一个性能试验来验证list中检索一个值,以及dict中检索一个值的计时对比
    · 生成包含连续值的list和包含连续关键码key的dict,用随机数来检验操作符in的耗时
import timeit
import random

for i in range(10000,1000001,20000):
    t = timeit.Timer("random.randrange(%d) in x"%i, "from __main__ import random,x")
    x = list(range(i))
    lst_time = t.timeit(number=1000)
    x = {j:None for j in range(i)}
    d_time = t.timeit(number=1000)
    print("%d,%10.3f,%10.3f" % (i, lst_time, d_time))
  • 对比
    三列从左到右依次是规模、列表、词典

Python官方的算法复杂度

每日一句:May force be with you always

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页