Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

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

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

系统和随机误差

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

4c68e21eaf17450bac395db7c7c294bc.jpg

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

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

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

直线拟合

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

74b39e0bf7224e4c8d9c223648910827.jpg

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

3672aea0218b4f8e9469237392a85cdb.png

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

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

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

3cda9239930e4d2e9da4f21d4bc9785f.png

尽管有一个值是完全偏离的,但我们得出的斜率(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()的用法。

相关文章

如何将你的PHP代码作为一个Composer包发布:https://knasmueller.net/how-to-publish-your-php-code-as-a-composer-package

你可以通过将你的库作为一个composer贡献给PHP社区来更容易地共享你的代码…

PHP 7.3中的尾逗号:https://knasmueller.net/trailing-commas-in-php-7-3

随着新的次要版本PHP 7.3的升级,函数调用中引入了尾逗号……英文原文:https://knasmueller.net/measure-code-execution-time-accurately-in-python

译者:忧郁的红秋裤

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

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

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

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

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

  3. python测试抽奖脚本_使用 Python 写一个简易的抽奖程序

    不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...

  4. python测试开发实战_《python测试开发实战》基于pytest基础部分实例1-Hello

    要求 实现如下命令行接口 python 1hello.py -h usage: 1hello.py [-h] [-n NAME] Say hello optional arguments: -h, - ...

  5. 可爱的python测试开发库及项目(python测试开发工具库汇总)

    转载: https://www.jianshu.com/p/ea6f7fb69501 可爱的python测试开发库及项目(python测试开发工具库汇总) github地址 相关书籍下载 Python ...

  6. python是非常依赖于已编译完成的代码吗_初识Python的几点疑惑

    一.python是什么? Python(英语发音:/ˈpaɪθən/), 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991 ...

  7. python 变量类型注释_变量类型、命名规则及代码注释

    人类在纸上可以写数字,也可以写文字,用数字来计算,用文字来说话,在人类的意识里你写的东西代表不同的含义!同样,在程序里面我们也按照人的习惯来设计,因此就有了变量类型这种说法!任何语言都会涉及到变量类型 ...

  8. python计算余弦距离_在Python中计算余弦距离的优化方法

    如果可以使用SciPy,可以使用spatial.distance中的余弦值: 如果您不能使用SciPy,您可以尝试通过重写Python来获得一个小的加速(编辑:但是没有像我以前想像的那样工作,见下文) ...

  9. python 实例化父类对象_在Python中从现有超类实例化子类

    所以我正在与第三方库进行交互,这会引发例外情况,但它基本上都会引发相同的异常(特别是suds.WebFault.但是,有可能从异常引发的数据中确定异常的确切类型.我希望将这个异常抽象为子类化这种类型的 ...

最新文章

  1. 转载_最值得阅读学习的10个C语言开源项目代码
  2. 解决 Windows 系统使用 Homestead 运行 Laravel 本地项目响应缓慢问题
  3. android仿ios弹框_在“提示”框中:iOS外观(在Android上运行),Google Maps作为Time Machine,下载Wii游戏保存...
  4. 实体框架 6.0:异步、IQueryable操作符和特性改进
  5. 【Codeforces633H】Fibonacci-ish II
  6. linux去除快捷方式箭头,焦点去除Win8快捷方式箭头软件
  7. transform模板函数调用tolower函数报错原因、解决办法
  8. php strtotime技巧,获取前几天、前几周、后几天、后几周,本月开始和本月结束时间
  9. c#实现任务栏气泡提醒
  10. 如何科学增长邮件订阅用户?
  11. 把时间当作朋友——第6章 交流
  12. 触发器flip-flop
  13. ORB-SLAM2的安装及试运行
  14. 500 – 内部服务器错误_无服务器:S3 – S3BucketPermissions –操作不适用于语句中的任何资源...
  15. 过了MySQL 8 OCP(1Z0-908),交一下作业
  16. Windows mobile 客户解决方案成功案例
  17. 滴滴出行A/B测试数据分析
  18. 共享wifi到底应该怎么样去运营呢?
  19. hashcat 2.哈希的装载
  20. Android硬件开发之——NFC技术

热门文章

  1. 洪水填充算法_区域填充算法和多边形填充的扫描线算法
  2. zen of python什么意思_Zen of Python
  3. 安装go client调用Kubernetes API
  4. 实际开发中的问题积累【积累】
  5. jquery 表单 清空
  6. opj1837 Balance(dp)
  7. System.IO命名空间
  8. python 通过索引迭代列表_python – NumPy – 迭代2D列表和打印(行,列)索引
  9. Ubuntu21.04安装网易有道词典
  10. OpenGL与gl glu glut freeglut glew glfw封装库关系(十五)