Python 中的 timeit 模块可以用来测试一段代码的执行耗时,如一个变量赋值语句的执行时间,一个函数的运行时间等。

timeit 模块是 Python 标准库中的模块,无需安装,直接导入就可以使用。导入时直接 import timeit ,可以使用 timeit() 函数和 repeat() 函数,还有 Timer 类。使用 from timeit import ... 时,只能导入 Timer 类(有全局变量 __all__ 限制)。

timeit 模块的源码总共只有 300 多行,主要就是实现上面的两个函数和一个类,可以自己看一下。

接下来就开始使用 timeit 模块来测试代码执行时间,我使用 timeit 模块来对比 Python 列表从头部添加数据和从尾部添加数据的执行时间(测试什么根据需求来定)。

一、使用 timeit() 函数测试运行时间

1. 准备测试函数

先写两个函数,一个函数是从列表头部添加数据,另一个函数是从列表尾部添加数据。

# coding=utf-8

def insert_time_test():

insert_list = list()

for i in range(10):

insert_list.insert(0, i)

def append_time_test():

append_list = list()

for i in range(10):

append_list.append(i)

if __name__ == '__main__':

import timeit

2. timeit(stmt="pass", setup="pass", timer=default_timer, number=default_number) 函数介绍

timeit() 函数有四个参数,每个参数都是关键字参数,都有默认值。

stmt:传入需要测试时间的代码,可以直接传入代码表达式或单个变量,也可以传入函数。传入函数时要在函数名后面加上小括号,让函数执行,如 stmt = ‘func()'  。

setup:传入 stmt 的运行环境,如 stmt 中使用到的参数、变量,要导入的模块等,如 setup = ‘from __main__ import func'。可以写一行语句,也可以写多行语句,写多行语句时用分号隔开。

如果 stmt 和参数 setup 参数不传值,那么就失去了测试的意义,所以这两个参数是必要的。

timer: timer 参数是当前操作系统的基本时间单位,默认会根据当前运行环境的操作系统自动获取(源码中已经定义),保持默认即可。

number:要测试的代码的运行次数,默认1000000(一百万)次,对于耗时的代码,运行太多次会花很多时间,可以自己修改运行次数。

3. 测试函数的运行时间

现在使用 timeit() 来测试上面两个函数的运行时间。

insert_time_timeit = timeit.timeit(stmt='insert_time_test()',

setup='from __main__ import insert_time_test')

print('insert_time_timeit: ', insert_time_timeit)

append_time_timeit = timeit.timeit(stmt='append_time_test()',

setup='from __main__ import append_time_test')

print('append_time_timeit: ', append_time_timeit)

运行结果:

('insert_time_timeit: ', 2.9112871)

('append_time_timeit: ', 1.8884124999999998)

可以看到,在列表头部添加数据的时间比在列表尾部添加数据的时间长。

4. 测试代码(表达式)的运行时间

继续使用 timeit() 测试上面代码的运行时间,只是这次是直接将代码传入到参数中,而不是传入函数。

insert_time_timeit = timeit.timeit(stmt='list(insert_list.insert(0, i) for i in init_list)',

setup='insert_list=list();init_list=range(10)',

number=100000)

print('insert_time_timeit: ', insert_time_timeit)

append_time_timeit = timeit.timeit(stmt='list(append_list.append(i) for i in init_list)',

setup='append_list=list();init_list=range(10)',

number=100000)

print('append_time_timeit: ', append_time_timeit)

由于时间很长,代码中特意将 number 从一百万次改成了十万次。运行结果如下:

('insert_time_timeit: ', 330.46189400000003)

('append_time_timeit: ', 0.21436310000001413)

相对来说,对于相同的操作,使用函数的运行时间远小于直接传入代码表达式的时间,头部插入数据的尤其明显。

二、使用 repeat() 函数测试运行时间

1. repeat(stmt="pass", setup="pass", timer=default_timer, repeat=default_repeat, number=default_number) 函数介绍

repeat() 函数有五个参数,每个参数都是关键字参数,都有默认值。相比 timeit() 函数而言,timeit() 函数有的参数 repeat() 函数都有,此外,repeat() 函数多了一个 repeat 参数。

repeat:表示测试要重复几次,可以理解为将相同参数的 timeit() 函数重复执行。最终的结果构成一个列表返回,repeat 默认为3次。

2. 测试函数的运行时间

现在使用 repeat() 来测试上面两个函数的运行时间。

insert_time_repeat = timeit.repeat(stmt='insert_time_test()',

setup='from __main__ import insert_time_test')

print('insert_time_repeat: ', insert_time_repeat)

append_time_repeat = timeit.repeat(stmt='append_time_test()',

setup='from __main__ import append_time_test')

print('append_time_repeat: ', append_time_repeat)

运行结果如下:

('insert_time_repeat: ', [2.7707739, 2.908885, 2.7164823999999994])

('append_time_repeat: ', [1.7458063, 1.777368000000001, 1.8675014999999995])

3. 测试代码(表达式)的运行时间

继续使用 repeat() 测试上面代码的运行时间,直接传入代码,上面将 number 改成十万次后,时间还是很长(300多秒),所以继续减小 number ,改成一万次。

insert_time_repeat = timeit.repeat(stmt='list(insert_list.insert(0, i) for i in init_list)',

setup='insert_list=list();init_list=range(10)',

repeat=5,

number=10000)

print('insert_time_repeat: ', insert_time_repeat)

append_time_repeat = timeit.repeat(stmt='list(append_list.append(i) for i in init_list)',

setup='append_list=list();init_list=range(10)',

repeat=5,

number=10000)

print('append_time_repeat: ', append_time_repeat)

运行结果如下:

('insert_time_repeat: ', [2.591015, 2.5814996999999997, 2.5547322, 2.6153070000000005, 2.5496864000000006])

('append_time_repeat: ', [0.0181692999999985, 0.01746889999999901, 0.018901899999999472, 0.018737400000000903, 0.018211900000000725])

三、使用 Timer 类测试运行时间

1. Timer 类介绍

上面使用了 timeit() 函数和 repeat() 函数,其实在 timeit 模块中,这两个函数都是对 Timer 类做了进一步的封装,实际调用的还是 Timer 类中的方法。

在 Timer 类中,实现了两个方法,timeit() 方法和 repeat() 方法,上面两个函数调用的就是这两个方法。

在使用  from timeit import ... 时,只能导入 Timer 类,所以可以直接使用 Timer 类来测试,可以自己去调用方法,使用起来更灵活。

2. 测试列表头部添加

先实例化一个 Timer 类的对象,实例化时传入 stmt 和 setup 参数(参数的含义与上面一致),timer 参数保持默认,然后通过实例对象调用对应的 timeit() 方法或 repeat() 方法,在 timeit() 方法中传入 number,在repeat() 方法中传入 number 和 repeat 。

使用 timeit() 方法和 repeat() 方法测试从头部添加数据的运行时间。

timer_insert = timeit.Timer(stmt='insert_time_test()', setup='from __main__ import insert_time_test')

insert_time_timeit = timer_insert.timeit(number=1000000)

print('insert_time_timeit: ', insert_time_timeit)

insert_time_repeat = timer_insert.repeat(number=1000000)

print('insert_time_repeat: ', insert_time_repeat)

运行结果如下:

('insert_time_timeit: ', 2.7732486)

('insert_time_repeat: ', [2.7367806999999997, 2.707402600000001, 2.7288245999999994])

3. 测试列表尾部添加

使用 timeit() 方法和 repeat() 方法测试从尾部添加数据的运行时间。

timer_append = timeit.Timer(stmt='append_time_test()', setup='from __main__ import append_time_test')

append_time_timeit = timer_append.timeit(number=1000000)

print('append_time_timeit: ', append_time_timeit)

append_time_repeat = timer_append.repeat(number=1000000)

print('append_time_repeat: ', append_time_repeat)

运行结果如下:

('append_time_timeit: ', 1.9966106000000001)

('append_time_repeat: ', [1.9523343999999998, 1.8373857999999998, 1.8695377000000004])

timeit 模块是一个比较简单的模块,大概用法就这些了。

总结

以上所述是小编给大家介绍的Python timeit模块的使用实践,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

python timer模块_Python timeit模块的使用实践相关推荐

  1. python标准库之timeit模块

    python标准库之timeit模块 --- 测量小代码片段的执行时间 源码: Lib/timeit.py https://docs.python.org/zh-cn/3.8/library/time ...

  2. python argparse模块_Python argparse模块应用实例解析

    这篇文章主要介绍了Python argparse模块应用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 简介 argparse是python ...

  3. python莫比乌斯环_python基础|模块

    1 模块简介 在python中常见的模块有三种,在python解释器中的内置模块,第三方模块和自定义模块.模块的有使用python编写的文件,有已被编译为共享库或DLL的C或C++扩展,也有使用C编写 ...

  4. python如何自定义模块_python自定义模块和开源模块使用方法

    模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...

  5. python import变量_Python import模块调用

    开发过程中代码越写越多,在一个文件里代码会越来越长,不容易维护,为了容易维护代码,我们把很多函数分组,分别放在不同的文件里,在Python中,一个.py文件就是模块(Module) 工具/原料 Pyt ...

  6. python shelve模块_python常用模块之shelve模块

    python常用模块之shelve模块 shelve模块是一个简单的k,v将内存中的数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据类型 我们在上面讲json.pickle ...

  7. python常用运维模块_python常用模块之一

    sys模块: sys模块是提供关于python本身的详细内在的信息的模块. sys.executable变量,它包含python解释器的路径 sys.platform变量,告诉我们现在处于什么操作系统 ...

  8. python 多层包多模块_python Modules模块操作

    今天学习python的Modules模块操作,并记录学习过程欢迎大家一起交流分享. 首先新建一个python文件命名为my_module.py的自定义moudle文件,在这个文件中进行模块代码编写: ...

  9. python counter模块_python collections模块 计数器(counter)

    一.计数器(counter) Counter是对字典类型的补充,用于追踪值的出现次数. ps:具备字典的所有功能 + 自己的功能 把我写入的元素出现的多少次都计算出来 import collectio ...

最新文章

  1. java been 字段命名的坑
  2. 百度的一个Ajax跨域方法 JavaScript是没有域的限制
  3. 页面左边导航固定,右边自适应宽度
  4. linux dump命令 异机,Oracle 11.2.0.4 从单实例,使用RMAN 异机恢复到RAC
  5. cad完全卸载教程_CAD室内设计中厨房布置实例
  6. linux的常用操作——vim和vi
  7. syslog工具_07 Docker 可视化管理和监控工具
  8. kali linux wps 2019 删除_良心推荐!Linux系统下常用办公软件大盘点
  9. 经典相声——企业信息化新“五官争功”
  10. 一号教学楼供配电设计
  11. HTML5 标签audio添加网页背景音乐代码
  12. java 英文日期转数字_Java SimpleDateFormat中英文时间格式化转换详解
  13. HDFS文件上传流程
  14. oracle中双引号代表什么意思,Oracle中的双引号与单引号
  15. 优动漫PAINT安装教程
  16. 记一次src挖洞实战——逻辑漏洞
  17. 【Excel】工作中会用到的excel操作和技巧
  18. linux命令~iconv
  19. 不离不弃 共赴鸿蒙什么意思,郑美善:不离不弃共赴鸿蒙是什么意思解释一下...
  20. 安卓四种launchMode的理解

热门文章

  1. 写了个数码照片的自动分类整理工具
  2. 使用 Request.QueryString 接受参数时,跟编码有关的一些问题
  3. 解决CentOS java环境不生效的问题
  4. Eclipse的Git插件Egit: merge合并冲突具体解决方法
  5. 【报告分享】2021年度私域经营洞察报告.pdf(附下载链接)
  6. 【报告分享】2021年中国新锐品牌增长潜力报告.pdf(附下载链接)
  7. 【报告分享】女性自我保护手册,教你应对10种常见危险处境.pdf(附189页pdf下载链接)...
  8. 《统计学习方法》代码全解析——第十一部分条件随机场
  9. java面向对象内存分析
  10. 复旦邱锡鹏组最新综述:A Survey of Transformers!