Python timeit模块的使用实践
Python中的timeit模块可以用来测试一段代码的执行耗时,如一个变量赋值语句的执行时间,一个函数的运行时间等。
timeit模块是Python标准库中的模块,无需安装,直接导入就可以使用。导入时直接importtimeit,可以使用 timeit()函数和repeat()函数,还有 Timer类。使用fromtimeitimport...时,只能导入Timer类(有全局变量__all__限制)。
timeit模块的源码总共只有300多行,主要就是实现上面的两个函数和一个类,可以自己看一下。
接下来就开始使用timeit模块来测试代码执行时间,我使用timeit模块来对比Python列表从头部添加数据和从尾部添加数据的执行时间(测试什么根据需求来定)。
一、使用timeit()函数测试运行时间
1.准备测试函数
先写两个函数,一个函数是从列表头部添加数据,另一个函数是从列表尾部添加数据。
#coding=utf-8 definsert_time_test(): insert_list=list() foriinrange(10): insert_list.insert(0,i) defappend_time_test(): append_list=list() foriinrange(10): append_list.append(i) if__name__=='__main__': importtimeit
2. timeit(stmt="pass",setup="pass",timer=default_timer,number=default_number)函数介绍
timeit()函数有四个参数,每个参数都是关键字参数,都有默认值。
stmt:传入需要测试时间的代码,可以直接传入代码表达式或单个变量,也可以传入函数。传入函数时要在函数名后面加上小括号,让函数执行,如stmt=‘func()' 。
setup:传入stmt的运行环境,如stmt中使用到的参数、变量,要导入的模块等,如setup=‘from__main__importfunc'。可以写一行语句,也可以写多行语句,写多行语句时用分号隔开。
如果stmt和参数setup参数不传值,那么就失去了测试的意义,所以这两个参数是必要的。
timer:timer参数是当前操作系统的基本时间单位,默认会根据当前运行环境的操作系统自动获取(源码中已经定义),保持默认即可。
number:要测试的代码的运行次数,默认1000000(一百万)次,对于耗时的代码,运行太多次会花很多时间,可以自己修改运行次数。
3.测试函数的运行时间
现在使用 timeit()来测试上面两个函数的运行时间。
insert_time_timeit=timeit.timeit(stmt='insert_time_test()', setup='from__main__importinsert_time_test') print('insert_time_timeit:',insert_time_timeit) append_time_timeit=timeit.timeit(stmt='append_time_test()', setup='from__main__importappend_time_test') print('append_time_timeit:',append_time_timeit)
运行结果:
('insert_time_timeit:',2.9112871)
('append_time_timeit:',1.8884124999999998)
可以看到,在列表头部添加数据的时间比在列表尾部添加数据的时间长。
4.测试代码(表达式)的运行时间
继续使用 timeit()测试上面代码的运行时间,只是这次是直接将代码传入到参数中,而不是传入函数。
insert_time_timeit=timeit.timeit(stmt='list(insert_list.insert(0,i)foriininit_list)', setup='insert_list=list();init_list=range(10)', number=100000) print('insert_time_timeit:',insert_time_timeit) append_time_timeit=timeit.timeit(stmt='list(append_list.append(i)foriininit_list)', setup='append_list=list();init_list=range(10)', number=100000) print('append_time_timeit:',append_time_timeit)
由于时间很长,代码中特意将number从一百万次改成了十万次。运行结果如下:
('insert_time_timeit:',330.46189400000003) ('append_time_timeit:',0.21436310000001413)
相对来说,对于相同的操作,使用函数的运行时间远小于直接传入代码表达式的时间,头部插入数据的尤其明显。
二、使用repeat()函数测试运行时间
1. repeat(stmt="pass",setup="pass",timer=default_timer,repeat=default_repeat,number=default_number)函数介绍
repeat()函数有五个参数,每个参数都是关键字参数,都有默认值。相比 timeit()函数而言,timeit()函数有的参数repeat()函数都有,此外,repeat()函数多了一个 repeat参数。
repeat:表示测试要重复几次,可以理解为将相同参数的timeit()函数重复执行。最终的结果构成一个列表返回,repeat默认为3次。
2.测试函数的运行时间
现在使用 repeat()来测试上面两个函数的运行时间。
insert_time_repeat=timeit.repeat(stmt='insert_time_test()', setup='from__main__importinsert_time_test') print('insert_time_repeat:',insert_time_repeat) append_time_repeat=timeit.repeat(stmt='append_time_test()', setup='from__main__importappend_time_test') print('append_time_repeat:',append_time_repeat)
运行结果如下:
('insert_time_repeat:',[2.7707739,2.908885,2.7164823999999994]) ('append_time_repeat:',[1.7458063,1.777368000000001,1.8675014999999995])
3.测试代码(表达式)的运行时间
继续使用 repeat()测试上面代码的运行时间,直接传入代码,上面将number改成十万次后,时间还是很长(300多秒),所以继续减小number,改成一万次。
insert_time_repeat=timeit.repeat(stmt='list(insert_list.insert(0,i)foriininit_list)', setup='insert_list=list();init_list=range(10)', repeat=5, number=10000) print('insert_time_repeat:',insert_time_repeat) append_time_repeat=timeit.repeat(stmt='list(append_list.append(i)foriininit_list)', setup='append_list=list();init_list=range(10)', repeat=5, number=10000) print('append_time_repeat:',append_time_repeat)
运行结果如下:
('insert_time_repeat:',[2.591015,2.5814996999999997,2.5547322,2.6153070000000005,2.5496864000000006]) ('append_time_repeat:',[0.0181692999999985,0.01746889999999901,0.018901899999999472,0.018737400000000903,0.018211900000000725])
三、使用Timer 类测试运行时间
1. Timer类介绍
上面使用了timeit()函数和repeat()函数,其实在timeit模块中,这两个函数都是对Timer类做了进一步的封装,实际调用的还是Timer类中的方法。
在Timer类中,实现了两个方法,timeit()方法和repeat()方法,上面两个函数调用的就是这两个方法。
在使用 fromtimeitimport...时,只能导入Timer类,所以可以直接使用Timer类来测试,可以自己去调用方法,使用起来更灵活。
2.测试列表头部添加
先实例化一个Timer类的对象,实例化时传入stmt和setup参数(参数的含义与上面一致),timer参数保持默认,然后通过实例对象调用对应的timeit()方法或repeat()方法,在timeit()方法中传入number,在repeat()方法中传入number和 repeat。
使用 timeit()方法和 repeat()方法测试从头部添加数据的运行时间。
timer_insert=timeit.Timer(stmt='insert_time_test()',setup='from__main__importinsert_time_test') insert_time_timeit=timer_insert.timeit(number=1000000) print('insert_time_timeit:',insert_time_timeit) insert_time_repeat=timer_insert.repeat(number=1000000) print('insert_time_repeat:',insert_time_repeat)
运行结果如下:
('insert_time_timeit:',2.7732486) ('insert_time_repeat:',[2.7367806999999997,2.707402600000001,2.7288245999999994])
3.测试列表尾部添加
使用 timeit()方法和 repeat()方法测试从尾部添加数据的运行时间。
timer_append=timeit.Timer(stmt='append_time_test()',setup='from__main__importappend_time_test') append_time_timeit=timer_append.timeit(number=1000000) print('append_time_timeit:',append_time_timeit) append_time_repeat=timer_append.repeat(number=1000000) print('append_time_repeat:',append_time_repeat)
运行结果如下:
('append_time_timeit:',1.9966106000000001) ('append_time_repeat:',[1.9523343999999998,1.8373857999999998,1.8695377000000004])
timeit模块是一个比较简单的模块,大概用法就这些了。
总结
以上所述是小编给大家介绍的Pythontimeit模块的使用实践,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。