timeit模块
timeit模块可以用来测试一小段Python代码的执行速度。
class timeit.Timer(stmt=‘pass’, setup=‘pass’, timer=)
Timer是测量小段代码执行速度的类。
stmt参数是要测试的代码语句(statment);
setup参数是运行代码时需要的设置;
两个参数都是字符串。 第一个参数是你要计时的语句或者函数。 传递给 Timer 的第二个参数是为第一个参数语句构建环境的导入语句。 从内部讲, timeit 构建起一个独立的虚拟环境, 手工地执行建立语句,然后手工地编译和执行被计时语句。
另外需要补充一点是,如果你想直接 stmt 那里执行函数。可以把函数申明在当前文件中,然后在 stmt = ‘func()’ 执行函数。然后使用 setup = ‘from main import func’ 即可,如果要import 多个需要使用 setup = from main import func; import simplejson’
timer参数是一个定时器函数,与平台有关。
timeit.Timer.timeit(number=1000000)
Timer类中测试语句执行速度的对象方法。number参数是测试代码时的测试次数,默认为1000000次。方法返回执行代码的平均耗时,一个float类型的秒数。
以下是五种生成列表的方式,以及测试生成列表用的时间
from timeit import Timer
def t1():
li=[]
for i in range(10000):
li.append(i)
def t2():
li=[]
for i in range(10000):
li=li+[i]
def t3():
li = [i for i in range(10000)]
def t4():
li = list(range(10000))
def t5():
li=[]
for i in range(10000):
li.extend(i)
timer1=Timer('t1()','from __main__ import t1')#02——list作为启动文件名字是__main__
print('append:',timer1.timeit(10000))
timer2=Timer('t2()','from __main__ import t2')
print('+:',timer2.timeit(10000))
timer3=Timer('t3()','from __main__ import t3')
print('[i for i in range]:',timer3.timeit(10000))
timer4=Timer('t4()','from __main__ import t4')
print('list(range):',timer4.timeit(10000))
timer5=Timer('t5()','from __main__ import t5')
print('extend:',timer4.timeit(10000))
可以看到用+的方式用时比较长,因为是生成另一个列表后在指向原来的列表
在链表末尾添加操作和开头插入操作
def t6():
li=[]
for i in range(10000):
li.append(i)
def t7():
li=[]
for i in range(10000):
li.insert(0,i)
timer6=Timer('t6()','from __main__ import t6')
print('append:',timer6.timeit(2000))
timer7=Timer('t7()','from __main__ import t7')
print('insert:',timer7.timeit(2000))
由于在开头插入,后面的数据都需要移动,所以插入的时间复杂度为o(n)
append的时间复杂度为o(1)
根据值查找索引和根据索引查找值
def t8():
li = list(range(100000))
a=li.index(99999)
def t9():
li = list(range(100000))
a=li[99999]
timer8=Timer('t8()','from __main__ import t8')
print('查找值:',timer8.timeit(1000))
timer9=Timer('t9()','from __main__ import t9')
print('查找下标:',timer9.timeit(1000))
根据值查找索引时间复杂度为o(n)
根据索引查找值时间复杂度为o(1)