- 译者序
- 前言
- 第1章 问答环节
- 第2章 Python 如何运行程序
- 第3章 如何运行程序
- 第4章 介绍 Python 对象类型
- 第5章 数字
- 第6章 动态类型简介
- 第7章 字符串
- 第8章 列表与字典
- 第9章 元组、文件及其他
- 第10章 Python 语句简介
- 第11章 赋值、表达式和打印
- 第12章 if 测试和语法规则
- 第13章 while 和 for 循环
- 第14章 迭代器和解析,第一部分
- 第15章 文档
- 第16章 函数基础
- 第17章 作用域
- 第18章 参数
- 第19章 函数的高级话题
- 第20章 迭代和解析,第二部分
- 第21章 模块:宏伟蓝图
- 第22章 模块代码编写基础
- 第23章 模块包
- 第24章 高级模块话题
- 第25章 OOP:宏伟蓝图
- 第27章 更多实例
- 第28章 类代码编写细节
- 第29章 运算符重载
- 第30章 类的设计
- 第31章 类的高级主题
- 第32章 异常基础
- 第34章 异常对象
- 第35章 异常的设计
- 第36章 Unicode 和字节字符串
- 字符串基础知识
- Python 的字符串类型
- 文本和二进制文件
- Python 3.0 中的字符串应用
- 转换
- 编码 Unicode 字符串
- 编码非ASCII文本
- 编码和解码非ASCII文本
- 其他 Unicode 编码技术
- 转换编码
- 在 Python 2.6 中编码 Unicode 字符串
- 源文件字符集编码声明
- 使用 Python 3.0 Bytes 对象
- 序列操作
- 创建 bytes 对象的其他方式
- 混合字符串类型
- 使用 Python 3.0(和 Python 2.6)bytearray 对象
- 使用文本文件和二进制文件
- Python 3.0 中的文本和二进制模式
- 类型和内容错误匹配
- 使用 Unicode 文件
- 在 Python 3.0 中处理 BOM
- Python 2.6 中的 Unicode 文件
- Python 3.0 中其他字符串工具的变化
- Struct二进制数据模块
- pickle对象序列化模块
- XML解析工具
- 本章小结
- 本章习题
- 习题解答
- 第37章 管理属性
- 第38章 装饰器
- 第39章 元类
- 附录A 安装和配置
- 附录B 各部分练习题的解答
- 作者介绍
- 封面介绍
计时模块替代方案
·它总是使用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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论