Python列表类型性能测试以及内置字典操作的时间复杂度分析

timeit模块

timeit模块可以用来测试一小段Python代码的执行速度。

class timeit.Timer(stmt='pass', setup='pass', timer=<timer function>)

Timer是测量小段代码执行速度的类。
stmt参数是要测试的代码语句(statment);
setup参数是运行代码时需要的设置;
timer参数是一个定时器函数,与平台有关。

timeit.Timer.timeit(number=1000000)

Timer类中测试语句执行速度的对象方法。number参数是测试代码时的测试次数,默认为1000000次。方法返回执行代码的平均耗时,一个float类型的秒数。

List的操作测试

import timeit

def test1():
	'''
		通过append方法添加数据
	'''
    li = []
    for i  in range(10000):
        li.append(i)

def test5():
	'''
		通过insert方法添加数据
	'''
    li = []
    for i in range(10000):
        li.insert(0,i)


def test2():
	'''
		通过列表相加添加数据
	'''
    li = []
    for i in range(10000):
        li = li + [i]

def test3():
	'''
		通过推导式添加数据
	'''
    li = [i for i in range(10000)]

def test4():
	'''
		通过list方法添加数据
	'''
    li = list(range(10000))



'''
    因为timeit测试是另外开一个模块测试,所以第二参数中,需要导入要测试函数
    当前模块的模块名称为= __main__
'''
timer1 = timeit.Timer('test1()','from __main__ import test1')
timer5 = timeit.Timer('test5()','from __main__ import test5')
timer2 = timeit.Timer('test2()','from __main__ import test2')
timer3 = timeit.Timer('test3()','from __main__ import test3')
timer4 = timeit.Timer('test4()','from __main__ import test4')

# 测试100次
print('append :%f'%timer1.timeit(number=100))
print('insert :%f'%timer5.timeit(number=100))
print('[]+[] :%f'%timer2.timeit(number=100))
print('[i for] :%f'%timer3.timeit(number=100))
print('list() :%f'%timer4.timeit(number=100))


''' 输出
append :0.171303
insert :2.461631
[]+[] :15.466849
[i for] :0.049168
list() :0.029723
'''

输出结果:

append :0.171303
insert :2.461631
[]+[] :15.466849
[i for] :0.049168
list() :0.029723

结论

来个列表相加[] + []操作是非常耗费时间
insert操作比较耗费时间

pop测试

x = range(2000000)
pop_zero = Timer("x.pop(0)","from __main__ import x")
print("pop_zero ",pop_zero.timeit(number=1000), "seconds")
x = range(2000000)
pop_end = Timer("x.pop()","from __main__ import x")
print("pop_end ",pop_end.timeit(number=1000), "seconds")

# ('pop_zero ', 1.9101738929748535, 'seconds')
# ('pop_end ', 0.00023603439331054688, 'seconds')

测试pop操作:从结果可以看出,pop最后一个元素的效率远远高于pop第一个元素

list内置操作的时间复杂度

操作时间复杂度描述
index[]O(1)index[索引] 查找操作
index赋值O(1)index[索引] = 值 赋值操作
appendO(1))append追加操作
pop()O(1)pop()方法操作的
pop(i)O(n)n为操作list的size
insert(i,item)O(n)n为list的size
del操作O(n)n为list的size
iterationO(n)n为list的size. 遍历操作
containsO(n)n为list的size

dict内置操作的时间复杂度

操作时间复杂度描述
copyO(n)浅拷贝操作 n为dict的size
get itemO(1)获取字典值
set itemO(1))这是字典值
delete itemO(1)删除字典值
iterationO(n)n为dictt的size. 遍历操作
containsO(1))n为list的size
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值