欢迎访问Python每天3分钟系列。

每天花3分钟时间,学习或温习一个Python知识点。

图片/a>

今天是第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次方组成的列表= [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)"""= 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

今天就说到这里,有问题给我留言。

声明:本网站资源来源于网络收集,如有侵权,请联系站长进行删除处理。 分享目的仅供大家学习和交流,请不要用于商业用途,否则后果自负。本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解。本站资源售价只是赞助,收取费用仅维持本站的日常运营所需。反馈邮箱:1159995880@qq.com