- 译者序
- 前言
- 第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 各部分练习题的解答
- 作者介绍
- 封面介绍
计时结果
如果我们研究这些代码及其输出足够长的时间,将会注意到,生成器表达式比列表解析运行得慢。尽管把一个生成器表达式包装到一个list调用中,会使得其功能等同于一个带有方括号的列表解析,两种表达式的内部实现看上去有所不同(尽管我们已经实际地对生成器测试的列表调用计时)。
有趣的是,当我在Windows XP的Python 2.5运行它的时候,结果也是相对类似的——列表解析几乎比对等的for循环语句快一倍,并且当映射abs(求绝对值)这样的一个内置函数的时候,map比列表解析略快。我没有测试生成器函数,并且输出格式也并不是太复杂。
这里列出的实际的Python 2.5测试时间比前面给出的输出要慢两倍,可能是因为我在最近的测试中使用了一款较快的笔记本,而不是因为Python 3.0的改进。实际上,如果从map测试中移除list调用以避免两次创建结果列表的话,这段脚本的所有Python 2.6的结果都比在同样机器上的Python 3.0要快一些(请自行测试以验证)。
如果我们修改这段脚本,在每次迭代上执行一个真正的操作(如加法),而不是调用abs这样的小的内置函数,看看会发生什么(如下代码中省略的部分与前面相同)。
如果需要针对map调用来调用一个用户定义的函数,会使它比for循环语句慢,尽管循环语句的版本的代码更多。在Python 3.0上如下所示。
在一款较慢的机器上,Python 2.5的结果再一次与前面的版本类似,但是,由于测试机器不同,要慢一倍:
由于解释器优化是如此内部化的一个问题,像这样对Python代码进行性能分析是一件非常需要技术的事情。事实上不可能猜测哪种方法会执行的最好,最好的办法是在自己的计算机上、用自己的Python版本,对自己的代码计时。在这种情况下,我们可以肯定地说的是,在这个Python版本下,在map调用中使用一个用户定义的函数至少会因为两种因素中的一种而执行较慢,并且列表解析对于这一测试运行最快。
正如我们前面提到的,性能应该不是你编写Python代码时首要关心的问题——要优化Python代码,你应该做的第一件事情就是不要优化Python代码!首先为了可读性和简单性而编写代码,然后,如果需要的话并且只有在需要的时候,再优化。如果对于你的程序需要处理的数据集合来说,五种替代方案中的任何一种足够快,这将是很好的事情;如果是这样的话,程序的清晰性应该是首要的目标。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论