用timeit测试代码性能
做性能测试,我们通常会运行同一段代码很多次,然后取平均时间来衡量一个函数或者一段代码的执行效率。
为了达到这个目的,Python有一个很好用的模块,那就是:timeit。
先看一个简单的例子,我们要测试下面这段代码的执行时间:
# 生成一个由2的n次方组成的列表
L = [2 ** n for n in range(20)]
print(L)
运行结果是:
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288]
在交互式Python测试代码性能
>>> import timeit
>>> timeit.timeit('L = [2 ** n for n in range(20)]')
4.08945516590029
- timeit模块是Python自带的模块,可以直接使用
- timeit重复执行上面的代码100万次(默认值),然后打印出总用时。这个次数可以自己通过number参数修改。
- 上面的例子是交互式Python,同样也可以写在Python代码文件中
在命令行下执行timeit
timeit也可以在命令行下直接执行,这样更方便:
$ python -m timeit 'L = [2 ** n for n in range(10)]'
100000 loops, best of 3: 2.99 usec per loop
测试多行代码的性能
如果要测试多行代码的性能,可以通过三括号把代码包起来:
import timeit
s = """\
L = []
for n in range(10):
L.append(2 ** n)"""
t = timeit.timeit(s)
在命令行中可以使用分号做多行分割:
$ python -m timeit 'x = 2; L = [x ** n for n in range(10)]'
100000 loops, best of 3: 3.07 usec per loop
或者用多个字符串传入:
$ python3 -m timeit 'x = 2' 'L = [x ** n for n in range(10)]'
100000 loops, best of 3: 3.03 usec per loop
如果多行代码有不同的缩进,可以在字符串中保留缩进:
$ python3 -m timeit \
'L = []' 'for n in range(10):' ' L.append(2 ** n)'
100000 loops, best of 3: 3.47 usec per loop