欢迎访问Python每天3分钟系列。
每天花3分钟时间,学习或温习一个Python知识点。
今天是第029篇:
用timeit测试代码性能
昨天的3分钟我们学习了使用time.time()
测试一个函数运行了多长时间:
import time
# 记录开始时间
start_time = time.time()
# 计算从10000的阶乘
total = 1
for i in range(1, 10000):
total = total * i
# 记录结束时间
end_time = time.time()
# 计算和打印用时
used_time = end_time - start_time
print(f'共用时:{used_time}')
这个方法还行。但是电脑每次执行时间可能会有差异。
做性能测试,我们通常会运行同一段代码很多次,然后取平均时间来衡量一个函数或者一段代码的执行效率。
为了达到这个目的,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
今天就说到这里,有问题给我留言。
原文链接:https://www.zsiss.com/5279.html,转载请注明出处。
请先
!