返回介绍

计时模块替代方案

发布于 2024-01-29 22:24:16 字数 2499 浏览 0 评论 0 收藏 0

前面小节介绍的计时模块是有效的,但是,它在多个方面还有些简单:

·它总是使用time.clock调用计时代码。尽管该选项在Windows上是最好的,time.time在某些UNIX平台上可能提供更好的解析。

·调整重复的次数需要修改模块级别的全局变量——如果要使用timer函数并且有多个导入者共享的话,这是不太理想的安排。

·此外,计时器必须通过运行测试函数很多次才能工作。要考虑随机的系统载入的波动,在所有的测试中选择最好的时间,而不是总的时间,可能会更好。

如下的替代实现了一种更为高级的计时器模块,它解决了前面所有这3点:根据平台选择一个计时器调用,允许重复计数作为一个名为_reps的关键字参数传入,并且提供N中最好的一个替代计时函数。

位于文件顶部的这个模块的文档字符串描述了模块的目标用途。它使用字典的pop操作,从用于测试函数的参数中删除_reps参数并为其提供一个默认值,并且,如果你将其trace函数修改为print的话,它会在开发过程中跟踪参数。要在Python 3.0或Python 2.6上测试这个新的计时器模块,把计时脚本做如下修改(这个版本中的测试函数对每个测试使用x+1操作,其中省略的部分和前面小节的代码相同)。

在Python 3.0下运行的时候,计时结果基本与前面相同,并且对于N个之和与N中最好的计时技术来说相对都是相同的——多次运行测试似乎做了很好的工作来过滤掉系统载入波动而采取最好的情况,但是,当测试一个长时间运行的函数的时候,N中最好的方案可能更好。在我的机器上的结果如下所示。

当然,这里N中最佳的计数器报告的时间是很小的,但是,如果你的程序在较大的数据集合上迭代很多次的话,它可能变得很显著。至少在相对性能方面,列表解析在大多数情况下表现最好。当使用内置函数时,map表现更好。

在Python 3.0中使用keyword-only参数

在这里,我们可以使用Python 3.0的keyword-only参数来简化计时器模块代码。正如我们在第19章中所学到的,keyword-only参数对于_reps这样的配置选项来说是理想的选择。必须将它们写在函数头部的一个*之后和一个**之前,并在一个函数调用中,它们必须由关键字传递,并且如果使用的话,出现在**之前。这里是前面模块的一个基于keyword-only参数的替代。尽管简单,它只能在Python 3.0下而不能在Python 2.6下编译和运行。

不考虑从运行到运行之间的可忽略的测试时间差异的话,这个版本与前面的版本以同样的方式使用并产生相同的结果。

实际上,我们也可以从交互提示模式来测试模块的这个版本,从而完全独立于序列计时器脚本——它是一个通用目的的工具。

对于像这个交互会话中一样的小函数,计时器的代码的成本可能像那些被计时函数一样显著,因此,我们不应该太绝对地取计时器结果(我们的计时不仅仅是这里的X**Y)。计时器的结果可以帮助我们判断代码替代方案的相对速度,并且可能对于如下这样较长时间运行的操作更有意义——计算2的一百万次方比前面的2**100 000要长一个量级(10倍)。

尽管这里计算的时间很小,往往在计算能力不同的程序里,差别是显著的。

参见第19章了解关于Python 3.0中的keyword-only参数的更多内容,它们可以简化像这样的配置工具的编码,但是不能与Python 2.X向后兼容。例如,如果想要比较2.X和3.X的速度,或者支持使用任意一种Python版本的程序员,较早的版本可能是更好的选择。如果你使用Python 2.6,上面会话的运行将与前面的计时器模块版本相同。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文