前言
python可以使用timeit
模块来测试小段代码的运行时间.timeit
主要的函数有timeit
和repeat
(还有default_timer
, 用法可见文章)
timeit
和repeat
的实现
1 | def timeit(stmt="pass", setup="pass", timer=default_timer, |
在上面的代码中可见, 无论是timeit
还是repeat
都是先 生成Timer
对象, 然后调用了Timer
对象的timeit
或repeat
函数。
参数
stmt
: 用于传入要测试时间的代码, 可以直接接受字符串的表达式, 也可以接受单个变量, 也可以接受函数。
PS: 传入函数时要使用参数setup
导入函数setup
: 传入stmt的运行环境, 比如stmt中使用到的参数、变量, 要导入的模块等。可以写一行语句, 也可以写多行语句, 写多行语句时要用**分号;**隔开语句。number
: 要测试的代码的运行次数, 默认100000次, 对于耗时的代码, 运行太多次会比较慢, 此时建议自己修改一下运行次数repeat
: 指测试要重复几次, 每次的结果构成列表返回, 默认3次。
用法
在使用timeit模块时, 有两种方式
- 直接使用
timeit.timeit()
、tiemit.repeat()
- 先用
timeit.Timer()
来生成一个Timer对象, 然后再用Timer对象用timeit()
和repeat()
函数, 相对灵活一些。
repeat的优点
可以多次重复测试, 并可以对测试所得的执行时间取最小值, 平均值, 最大值, 更方便分析。
例子
例子1
测试一个列表推导式 比正常写for循环快多少
1 | import timeit |
例子2
使用timeit
来比较递归斐波那契和迭代斐波那契的时间效率差异
注意
代码中分别定义了两个函数,
要测试这两个函数, 需导入这两个函数,
即设置setup = from __main__ import recursive_fibonacci
,
表明从当前运行的代码下导入这两个函数。
如果是其他模块的, 则要import
别的模块进来
1 | import timeit |
例子3
setup
参数的灵活使用, 设置stmt
的运行环境的详细例子
涉及
- 导入模块
- 变量定义
- 函数调用
- 多行写
setup
要加分号的方式
1 | import timeit |
命令行调用timeit
1 | python -m timeit [-n N] [-r N] [-s S] [-t] [-c] [-h] [statement...] |
1 | $ python -m timeit '"-".join(str(n) for n in range(100))' |