文 | 菊子皮(转载请注明出处)
关注公众号:AIAS编程有道
同名B站:AIAS编程有道
环境:Python 3.7,VS Code
timeit模块使用
本部分参考Python3 timeit的用法 以及官方文档
有时候需要测试创建某种变量而花费的时间、有时候需要测试某个函数的运行的时间,对于简单的Python程序使用Python自带timeit模块是不错的选择。
这里也只介绍经常使用的几个方法,更多内容可参考官方文档。Python3中的timeit模块可以用来测试小段代码的运行时间。其中主要通过两个函数来实现:timeit和repeat。
timeit. timeit(stmt=‘pass’, setup=‘pass’, timer=, number=1000000, globals=None)
使用给定语句、 setup 代码和 timer 函数创建一个 Timer
实例,并执行 number 次其 timeit()
方法。可选的 globals 参数指定用于执行代码的命名空间。
timeit.repeat(stmt=‘pass’, setup=‘pass’, timer=, repeat=5, number=1000000, globals=None)
使用给定语句、 setup 代码和 timer 函数创建一个 Timer
实例,并使用给定的 repeat 计数和 number 执行运行其 repeat()
方法。可选的 globals 参数指定用于执行代码的命名空间。
参数说明:
stmt:用于传入要测试时间的代码,可以直接接受字符串的表达式,也可以接受单个变量,也可以接受函数。传入函数时要把函数申明在当前文件中,然后在 stmt = ‘func()’ 执行函数,然后使用 setup = ‘from main import func’
setup:传入stmt的运行环境,比如stmt中使用到的参数、变量,要导入的模块等。可以写一行语句,也可以写多行语句,写多行语句时要用分号;隔开语句。
number:要测试的代码的运行次数,默认100000次,对于耗时的代码,运行太多次会比较慢,此时建议自己修改一下运行次数
repeat:指测试要重复几次,每次的结果构成列表返回,默认5次。
使用案例:
# <1>
print(timeit.timeit(stmt='list(i**2 for i in normal_list)', setup='normal_list=range(10000)', number=10))
# 0.0857056 结果也会与计算机性能有关
# <2>
print(timeit.repeat(stmt='list(i**2 for i in normal_list)', setup='normal_list=range(10000)', repeat=2, number=10))
# [0.08216990000000002, 0.055868999999999974]
# <3> setup 为复合语句
print(timeit.timeit(stmt='list(i**2 for i in normal_list)', setup='a=10000;normal_list=range(a)', number=10))
# 0.0660696
# <4>
print(timeit.repeat(stmt='list(i**2 for i in normal_list)', setup='a=10000;normal_list=range(a)', repeat=2, number=10))
# [0.06270019999999998, 0.054296299999999964]
# <5>
def func():
normal_list = range(10000)
L = [i**2 for i in normal_list]
# stmt为函数
print(timeit.timeit("func()", setup="from __main__ import func", number=10))
# 0.056916100000000025
# <6>
print(timeit.repeat("func()", setup="from __main__ import func", repeat=3, number=10))
# [0.057099300000000075, 0.05018290000000003, 0.04987839999999999]
程序说明:
<1> 运行语句 list(i**2 for i in normal_list)
其中语句的参数为normal_list=range(10000)
一个10次所使用的时间。
<2> 在<1>的基础上,重复运行2次,每次运行的时间都放在一个列表中
<3> 提供参数的语句可以是多个
<4> 在<3>的基础上,重复运行2次,每次运行的时间都放在一个列表中
<5> 使用自定义函数情况
<6> 在<5>的基础上,重复运行3次,每次运行的时间都放在一个列表中