测量代码执行时间是困难的。学习如何消除系统和随机测量误差,并获得更可靠的结果。

我们经常需要测量代码的特定部分执行需要多长时间。不幸的是,简单地测量函数调用之前和之后的系统时间并不是很严谨,而且容易受到系统和随机测量错误的影响。这对于测量非常短的间隔(< 100毫秒)来说尤其如此。

系统和随机误差

那么,下面这种测量方法有什么问题呢?

首先,这里会有一个系统误差:通过调用time.perf_counter(), 一个未知量的时间会被加入到my_function()的执行时间中。多少时间呢?这取决于操作系统、特定的实现和其他不可控因素。

其次,还存在一个随机误差:对my_function()调用的执行时间在一定程度上会有变化。

我们可以通过多次测量并取其平均值来抵抗随机误差。然而,消除系统误差的难度要大得多。

直线拟合

卡洛斯·莫雷诺和塞巴斯蒂安·菲什迈斯特提出了一种新技术来减小这种系统性错误。基本思想是首先测量一个函数调用的时间,然后测量两个函数调用的时间,然后测量三个函数调用的时间,依此类推。最终的方法可能是这样的:

然后你可以通过测量结果来拟合一条直线:

总执行时间可以通过获取该直线y = a x + b的斜率a得到。

在上面的例子中,直线是y = 205.91 x + 29.56;因此,执行时间等于205.91毫秒。

作者指出,这种测量方法对于偶尔会出现大误差的测量是非常可靠的。这可以通过人为地改变第4次测量并重新运行直线拟合过程来视觉化:

尽管有一个值是完全偏离的,但我们得出的斜率(201.15)仍然非常接近之前的测量值。

想要更多地了解这种方法的数学基础知识,我邀请你阅读这篇原创性论文:https://uwaterloo.ca/embedded-software-group/sites/ca.embedded-software-group/files/uploads/files/ieee-esl-precise-measurements.pdf

Python实现

你可以在我的公共GitLab仓库中找到我对所展示算法的实现:https://gitlab.com/bernhard.knasmueller/accurate-time-measurements-python

这个算法和想法都要归功于Moreno 和 Fischmeister。

编辑于2020年1月18日:更正了perf_counter()的用法。

英文原文:https://knasmueller.net/measure-code-execution-time-accurately-in-python
译者:忧郁的红秋裤

perf script 执行时间_在Python中准确地测量代码执行时间相关推荐

  1. python代码斜率_在Python中准确地测量代码执行时间

    测量代码执行时间是困难的.学习如何消除系统和随机测量误差,并获得更可靠的结果. 我们经常需要测量代码的特定部分执行需要多长时间.不幸的是,简单地测量函数调用之前和之后的系统时间并不是很严谨,而且容易受 ...

  2. python测试代码运行时间_在Python中准确地测量代码执行时间

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 测量代码执行时间是困难的.学习如何消除系统和随机测量误差,并获得更可靠的结果. 我们经常需要测量代码的特定 ...

  3. python获取类的类属性_在python中获取类和实例的属性

    在Python中工作下一个代码: class MyClass(object): field = 1 >>> MyClass.field 1 >>> MyClass( ...

  4. python正弦函数拟合_在Python中拟合正弦数据

    我想将下面附带的数据与-a*sin(b*x + c)(或可能也可以使用-a*sin(2*x))与a b c作为要确定的值的函数拟合.我使用了scipy.optimize.curve_fit,但效果不好 ...

  5. python处理大型矩阵_在python中处理大型密集矩阵

    基本上,在 python中存储和使用密集矩阵的最佳方法是什么? 我有一个项目,可以在数组中的每个项目之间生成相似度量. 每个项目都是一个自定义类,并存储一个指向另一个类的指针和一个表示它与该类&quo ...

  6. python中main的作用_浅析python 中__name__ = '__main__' 的作用

    很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...

  7. python删除字符串中重复字符_从Python中删除字符串标点符号的最佳方法

    似乎有一个比以下更简单的方法: 1 2 3import string s ="string. With. Punctuation?" # Sample string out = s ...

  8. python对象引用计数器_在Python中借助计数器对象对项目进行计数

    python对象引用计数器 前提 (The Premise) When we deal with data containers, such as tuples and lists, in Pytho ...

  9. python如何查看有什么模块_在python中如何查看模块功能

    在python中查看模块功能的方法:1.在python命令行输入help()函数进入help帮助文档界面:2.键入[modules]列出当前所有安装的模块:3.键入相应的模块名称即可得到该模块的功能信 ...

最新文章

  1. 利用WPF建立自己的3d gis软件(非axhost方式)(五)在鼠标点击的位置增加UI
  2. SpringBoot中整合Mail实现发送模板邮件
  3. cpu 内存占用比较高的解决方案
  4. 用不好PPT模板的本质原因是什么,怎么办
  5. 在JDK 10中不可变与不可修改
  6. CentOS安装SVN客户端
  7. 手机modem开发(20)---公平性测试
  8. SQLi-LABS Less-2,联合注入+报错注入
  9. 酷客多小程序携手Richly network Pte Led正式进军新加坡市场
  10. Java数据结构——用链表实现栈
  11. live2d内嵌html,博客(网页)添加 Live2D 看板娘
  12. 单片机音乐倒数计时器c语言,基于单片机音乐倒数计时器设计.doc
  13. 小笨狼与LLDB的故事
  14. Cadence快捷键设置
  15. 估值15.59亿,融资15亿,百合网的新三板孤注一掷,局中有局!
  16. emule最新服务器地址,关于emule 服务器列表
  17. 几乎零基础的git入门级分享
  18. 睡个“好”觉,还真是有益身心胖瘦的
  19. Python turtle画小猪佩奇
  20. Springboot中使用阿里云短信验证码服务

热门文章

  1. SQL Server数据库表锁定原理以及如何解除表的锁定
  2. Win10开机提示蓝屏错误ntoskrnl.exe怎么修复?
  3. ubuntu 一张网卡绑定多个ip
  4. 计算机网络2020秋--第四次测验
  5. 升级node,老的项目启动不了的解决方法(亲测有效)
  6. Promise--优雅的异步回调解决方案
  7. Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException 异常
  8. XSS 跨站脚本攻击 的防御解决方案
  9. Polymer元素和AngularJS指令有什么区别?
  10. 在PostgreSQL中创建数据库的副本