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

我们经常需要测量代码的特定部分执行需要多长时间。不幸的是,简单地测量函数调用之前和之后的系统时间并不是很严谨,而且容易受到系统和随机测量错误的影响。这对于测量非常短的间隔(< 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
译者:忧郁的红秋裤

python代码斜率_在Python中准确地测量代码执行时间相关推荐

  1. perf script 执行时间_在Python中准确地测量代码执行时间

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

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

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

  3. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  4. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  5. python游戏房间_使用 Python 学习面向对象的编程 | Linux 中国

    使用 Python 类使你的代码变得更加模块化.-- Seth Kenlon 在我上一篇文章中,我解释了如何通过使用函数.创建模块或者两者一起来使 Python 代码更加模块化.函数对于避免重复多次使 ...

  6. python注入进程_向进程中注入Python代码

    我想把Python代码注入到一个进程中,当它注入时,它似乎会使我的进程崩溃.我没有在我自己的程序中得到任何错误,但目标进程停止工作.被调用的非托管api没有给我任何错误,并且似乎已经正确地执行了它们的 ...

  7. 动漫的python语言代码大全_使用Python来看看动漫中的你

    百度人工智能运用世界领先的对抗生成网络,结合人脸检测.头发分割.人像分割等技术,为用户量身定制千人千面的二次元动漫形象,并且可通过参数设置,生成戴口罩的二次元动漫人像. 先来一组图看看效果 八种口罩任 ...

  8. 用python实现点阵屏_用Python代码来绘制彭罗斯点阵的教程

    这里是显示彭罗斯点阵的Python的脚本.是的,这是可以运行的有效Phython代码. 译注:彭罗斯点阵,物理学术语.上世纪70年代英国数学家彭罗斯第一次提出了这个概念,称为彭罗斯点阵(Pen-ros ...

  9. python植物大战僵尸代码例_用Python实现植物大战僵尸游戏,很酷

    以前很火的植物大战僵尸游戏, 本想在网上找个python版本游戏学习下,无奈没有发现比较完整的,那就自己来写一个把.图片资源是从github上下载的,因为图片资源有限,只能实现几种植物和僵尸. 功能实 ...

最新文章

  1. 他花了一个月,使用MicroPython将自己装进OLED里面
  2. 【DP、线段树优化】琪露诺
  3. python3如何使用mysql_python3怎么用sqlalchemy操作mysql
  4. 通达信手机版指标源码大全_通达信指标公式源码短炒买卖指标
  5. java 压缩加密 github_关于Java:使用github中的AES-256-CBC加密
  6. Android中使用Intent进行窗体切换,并且传值和自定义类的对象详解
  7. 不宜佩带佛像,宜佩带佛号、咒语
  8. Deming质量管理14点
  9. jQuery实现留言板案例
  10. 推荐一个数据可视化大屏幕报表开源系统
  11. 【软件需求工程】北理的恶龙们01——需求获取阶段准备工作
  12. SAT数学:必背公式之三角函数
  13. Springboot 前后端交互 Long类型传输 前端获取数据受限
  14. 没有远程桌面客户端访问许可证
  15. EPROCESS+KPCR+ETHREAD部分介绍-学习记录
  16. 一,Weston简介
  17. quickBI嵌入自研系统
  18. 【安全牛学习笔记】w3af
  19. nfc充值java_实测北京公交一卡通NFC手机充值
  20. idea重装以后打不开,双击没有反应

热门文章

  1. IT中一些常见英汉互译
  2. 第23章:MongoDB-聚合操作--聚合命令
  3. 将地址强制转换为指针
  4. [07] 使用注解完成IOC配置
  5. Android WebView JavaScript交互
  6. 跟我学android-Android应用基本组件介绍(五)
  7. 20120918-LIST类定义《数据结构与算法分析》
  8. keil无法生成axf文件之解决方法
  9. matplotlib 无法显示中文字体的解决方法
  10. 推荐实践:新一代Rank技术在阿里巴巴定向广告推荐系统中的应用与实践