# ++++++++++++++++++++++++++++++++++++++++++++++++++++++
# <read-code-notes: 2021/6/9/9:48>
# NOTE: 使用timeit库做函数性能时间测试。
参考官方文档很好理解:https://docs.python.org/zh-cn/3/library/timeit.html#module-timeit

该模块定义了三个便利函数和一个公共类:

timeit.timeit(stmt='pass', setup='pass', timer=<default timer>, number=1000000, globals=None)
    使用给定语句、 setup码和timer函数创建一个Timer实例,并执行 number 次其 timeit() 方法。可选的 globals 参数指定用于执行代码的命名空间。
    在 3.5 版更改: 添加可选参数 globals 。

timeit.repeat(stmt='pass', setup='pass', timer=<default timer>, repeat=5, number=1000000, globals=None)
    使用给定语句、 setup 代码和 timer 函数创建一个 Timer 实例,并使用给定的 repeat 计数和 number 执行运行其 repeat() 方法。可选的 globals 参数指定用于执行代码的命名空间。
    在 3.5 版更改: 添加可选参数 globals 。
    在 3.7 版更改: repeat 的默认值由 3 更改为 5 。

timeit.default_timer()
    默认的计时器,总是 time.perf_counter() 。
    在 3.3 版更改: time.perf_counter() 现在是默认计时器。

class timeit.Timer(stmt='pass', setup='pass', timer=<timer function>, globals=None)
    用于小代码片段的计数执行速度的类。
    构造函数接受一个将计时的语句、一个用于设置的附加语句和一个定时器函数。两个语句都默认为 'pass' ;计时器函数与平台有关(请参阅模块文档字符串)。 stmt 和 setup 也可能包含多个以 ; 或换行符分隔的语句,只要它们不包含多行字符串文字即可。该语句默认在 timeit 的命名空间内执行;可以通过将命名空间传递给 globals 来控制此行为。
    要测量第一个语句的执行时间,请使用 timeit() 方法。 repeat() 和 autorange() 方法是方便的方法来调用 timeit() 多次。
    setup 的执行时间从总体计时执行中排除。
    stmt 和 setup 参数也可以使用不带参数的可调用对象。这将在一个计时器函数中嵌入对它们的调用,然后由 timeit() 执行。请注意,由于额外的函数调用,在这种情况下,计时开销会略大一些。
    在 3.5 版更改: 添加可选参数 globals 。

timeit(number=1000000)
        执行 number 次主要语句。这将执行一次 setup 语句,然后返回执行主语句多次所需的时间,以秒为单位测量为浮点数。参数是通过循环的次数,默认为一百万。要使用的主语句、 setup 语句和 timer 函数将传递给构造函数。
        注解:默认情况下, timeit() 暂时关闭 garbage collection 。这种方法的优点在于它使独立时序更具可比性。缺点是GC可能是所测量功能性能的重要组成部分。如果是这样,可以在 setup 字符串中的第一个语句重新启用GC。例如:
        timeit.Timer('for i in range(10): oct(i)', 'gc.enable()').timeit()

autorange(callback=None)
        自动决定调用多少次 timeit() 。
        这是一个便利函数,它反复调用 timeit() ,以便总时间 >= 0.2 秒,返回最终(循环次数,循环所用的时间)。它调用 timeit() 的次数以序列 1, 2, 5, 10, 20, 50, ... 递增,直到所用的时间至少为0.2秒。
        如果给出 callback 并且不是 None ,则在每次试验后将使用两个参数调用它: callback(number, time_taken) 。
        3.6 新版功能.

repeat(repeat=5, number=1000000)
        调用 timeit() 几次。
        这是一个方便的函数,它反复调用 timeit() ,返回结果列表。第一个参数指定调用 timeit() 的次数。第二个参数指定 timeit() 的 number 参数。
        注解:从结果向量计算并报告平均值和标准差这些是很诱人的。但是,这不是很有用。在典型情况下,最低值给出了机器运行给定代码段的速度的下限;结果向量中较高的值通常不是由Python的速度变化引起的,而是由于其他过程干扰你的计时准确性。所以结果的 min() 可能是你应该感兴趣的唯一数字。之后,你应该看看整个向量并应用常识而不是统计。
        在 3.7 版更改: repeat 的默认值由 3 更改为 5 。

print_exc(file=None)
        帮助程序从计时代码中打印回溯。
        典型使用:
        t = Timer(...)       # outside the try/except
        try:
            t.timeit(...)    # or t.repeat(...)
        except Exception:
            t.print_exc()
        与标准回溯相比,优势在于将显示已编译模板中的源行。可选的 file 参数指向发送回溯的位置;它默认为 sys.stderr 。

命令行界面:
从命令行调用程序时,使用以下表单:
python -m timeit [-n N] [-r N] [-u U] [-s S] [-h] [statement ...]
如果了解以下选项:
-n N, --number=N
    执行 '语句' 多少次

-r N, --repeat=N
    重复计时器的次数(默认为5)

-s S, --setup=S
    最初要执行一次的语句(默认为 pass )

-p, --process
    测量进程时间,而不是 wallclock 时间,使用 time.process_time() 而不是 time.perf_counter() ,这是默认值
    3.3 新版功能.

-u, --unit=U
    指定定时器输出的时间单位;可以选择 nsec,usec,msec或sec
    3.5 新版功能.

-v, --verbose
    打印原始计时结果;重复更多位数精度

-h, --help
    打印一条简短的使用信息并退出

可以通过将每一行指定为单独的语句参数来给出多行语句;通过在引号中包含参数并使用前导空格可以缩进行。多个 -s 选项的处理方式相似。

如果未给出 -n,则会通过尝试按序列 1, 2, 5, 10, 20, 50, ... 递增的数值来计算合适的循环次数,直到总计时间至少为 0.2 秒。

default_timer() 测量可能受到在同一台机器上运行的其他程序的影响,因此在需要精确计时时最好的做法是重复几次计时并使用最佳时间。 -r 选项对此有利;在大多数情况下,默认的 5 次重复可能就足够了。 你可以使用 time.process_time() 来测量CPU时间。

注解:执行 pass 语句会产生一定的基线开销。这里的代码不会试图隐藏它,但你应该知道它。可以通过不带参数调用程序来测量基线开销,并且Python版本之间可能会有所不同。

# ++++++++++++++++++++++++++++++++++++++++++++++++++++++
示例1:
自己设置重复次数number,不自己设置则系统根据程序耗时自动设置。
$ python3 -m timeit --number 100 '"-".join(str(n) for n in range(100))'
100 loops, best of 3: 17.9 usec per loop
$ python3 -m timeit '"-".join([str(n) for n in range(100)])'
10000 loops, best of 5: 27.5 usec per loop
$ python3 -m timeit '"-".join(map(str, range(100)))'
10000 loops, best of 5: 23.2 usec per loop
示例2:
import timeitstrlist = ["test str" for n in range(10000)]def join_test():return "".join(strlist)def plus_test():result = ""for i in strlist:result = result + ireturn resultif __name__ == "__main__":jointimer = timeit.timeit()# print(jointimer)# exit()jointimer = timeit.Timer("join_test()", "from __main__ import join_test")print("jointime:", jointimer.timeit(number=1000))plustimer = timeit.Timer("plus_test()", "from __main__ import plus_test")print("plustime:", plustimer.timeit(number=1000))

python3使用timeit库做函数性能时间测试相关推荐

  1. “由于 open 函数中有时间冲突,WMI ADAP 无法处理 RemoteAccess 性能库”。

    某厂商OPC客户端程序,运行一小时左右会导致电脑关机. 症状:windows事件监视器显示:"由于 open 函数中有时间冲突,WMI ADAP 无法处理 RemoteAccess 性能库& ...

  2. c库的rand/random随机数产生函数性能差?

    有网文称c标准库的rand/random随机数产生函数性能极差.一直信以为真,但从没做过验证.最近因其他因缘,写了些代码专门验证rand/random的性能.结果大出意料,颠覆之前的成见. 结论如下: ...

  3. C语言标准库里的获取时间函数及时间格式转换详解

    C语言标准库里的获取时间函数及时间格式转换详解 头文件: #include <time.h> 相关库函数(截图摘自:https://www.runoob.com/cprogramming/ ...

  4. 用指针做函数参数自己编程实现字符串连接函数strcat()的功能。CQUPT题库

    用指针做函数参数自己编程实现字符串连接函数strcat()的功能.CQUPT题库 下面程序中存在比较隐蔽的错误,请通过分析和调试程序,发现并改正程序中的错误. 注意:请将修改正确后的完整源程序拷贝粘贴 ...

  5. Python的Numpy库的函数astype()在将大范围数据类型转换为小范围数据类型时并不是做饱和(saturate)操作(附实现饱和操作的方法)

    Python的Numpy库的函数astype()在将大范围数据类型转换为小范围数据类型时并不是做饱和(saturate)操作. 关于什么是饱和操作,可以参看博文:https://blog.csdn.n ...

  6. Python timeit库测试代码片段运行时间

    timeit库文档:https://docs.python.org/zh-cn/3/library/timeit.html timeit 是一个用来测量小代码片段执行时间的工具库,有命令行和函数调用两 ...

  7. python3 urlencode_Python2和Python3中urllib库中urlencode的使用注意事项

    前言 在Python中,我们通常使用urllib中的urlencode方法将字典编码,用于提交数据给url等操作,但是在Python2和Python3中urllib模块中所提供的urlencode的包 ...

  8. 使用karma+mocha+chai为vue组件库做单元测试

    前言 单元测试,这一环节对我们的应用的重要性不言而喻,它能很大程度确保我们项目运行的健壮性.因此,前一段时间,笔者公司要求现有的vue搭建的npm组件库做单元测试.之前,笔者对单元测试做过了解,一直想 ...

  9. python3.7扩展库是什么_Python3.4以后的版本中,____________库用于安装管理Python扩展包,________________库用于发布Python包。_学小易找答案...

    [填空题]Python3.4以后的版本中,____________库用于安装管理Python扩展包,________________库用于发布Python包. [判断题]Directions: The ...

最新文章

  1. Javascript全局变量var与不var的区别深入解析
  2. jupyter notebook xdg-settings 错误
  3. [jQuery]使用jQuery.Validate进行客户端验证(高级篇-下)——不使用微软验证控件的理由...
  4. 网站SEO更新时选择适当的时间点有什么好处?
  5. php安装扩展写kafca,安装PHP的kafka扩展
  6. Bailian4068 判断是否可以构成等差数列【字符串流+排序】
  7. 大数据是如何改变零售行业的
  8. 信捷plc用c语言编程软件,XDPPro(信捷PLC编程软件) V3.1.0c 官方版
  9. @[TOC](0x01131A81 处(位于 Project2.exe 中)引发的异常: 0xC0000005: 读取位置 0x00320000 时发生访问冲突。
  10. 网络继电器的EPICS IOC搭建
  11. Nonebot QQ机器人插件七:智能聊天机器人
  12. OCR扫描识别录入之汽车车架号(VIN码)识别查询系统
  13. 推荐两款外文检查语法错误和润色的软件
  14. SQL Leetcode练习题
  15. 红米note3全网通 |2015112| 官方线刷包救砖包解账户锁屏幕锁
  16. Citrix PVS架构和工作原理
  17. 如何利用python准确预测双色球开奖结果
  18. 利用ffmpeg实现Windows音视频录制
  19. WIN10和MAC OS双系统,调整MAC os分区给WIN10系统扩C盘
  20. 国际版抖音加群 振兴中华

热门文章

  1. HTML和CSS学习笔记——day01
  2. 华为OD机试题,用 Java 解【磁盘容量排序】问题 | OD统一考试(B卷)
  3. linux shell之回放和广播
  4. python载入图片序列_【Python】序列和图片之间的转化
  5. 对比其它设计工具,Figma都有哪些优点和缺点
  6. A. The Rank
  7. java 获取url_Java获取当前访问url地址(SpringMVC)
  8. PixiJS - 最快、最灵活的 2D WebGL 渲染引擎
  9. 【数据结构与算法_java】面试题及答案汇总
  10. Spring Boot 整合 log4j 实现日志管理