- Preface 前言
- 第1章 引论
- 第2章 编程惯用法
- 第3章 基础语法
- 建议19:有节制地使用 from…import 语句
- 建议20:优先使用 absolute import 来导入模块
- 建议21:i+=1 不等于 ++i
- 建议22:使用 with 自动关闭资源
- 建议23:使用 else 子句简化循环(异常处理)
- 建议24:遵循异常处理的几点基本原则
- 建议25:避免 finally 中可能发生的陷阱
- 建议26:深入理解 None 正确判断对象是否为空
- 建议27:连接字符串应优先使用 join 而不是 +
- 建议28:格式化字符串时尽量使用 .format 方式而不是 %
- 建议29:区别对待可变对象和不可变对象
- 建议30:[]、() 和 {}:一致的容器初始化形式
- 建议31:记住函数传参既不是传值也不是传引用
- 建议32:警惕默认参数潜在的问题
- 建议33:慎用变长参数
- 建议34:深入理解 str() 和 repr() 的区别
- 建议35:分清 staticmethod 和 classmethod 的适用场景
- 第4章 库
- 建议36:掌握字符串的基本用法
- 建议37:按需选择 sort() 或者 sorted()
- 建议38:使用 copy 模块深拷贝对象
- 建议39:使用 Counter 进行计数统计
- 建议40:深入掌握 ConfigParser
- 建议41:使用 argparse 处理命令行参数
- 建议42:使用 pandas 处理大型 CSV 文件
- 建议43:一般情况使用 ElementTree 解析 XML
- 建议44:理解模块 pickle 优劣
- 建议45:序列化的另一个不错的选择 JSON
- 建议46:使用 traceback 获取栈信息
- 建议47:使用 logging 记录日志信息
- 建议48:使用 threading 模块编写多线程程序
- 建议49:使用 Queue 使多线程编程更安全
- 第5章 设计模式
- 第6章 内部机制
- 建议54:理解 built-in objects
- 建议55:init() 不是构造方法
- 建议56:理解名字查找机制
- 建议57:为什么需要 self 参数
- 建议58:理解 MRO 与多继承
- 建议59:理解描述符机制
- 建议60:区别 getattr() 和 getattribute() 方法
- 建议61:使用更为安全的 property
- 建议62:掌握 metaclass
- 建议63:熟悉 Python 对象协议
- 建议64:利用操作符重载实现中缀语法
- 建议65:熟悉 Python 的迭代器协议
- 建议66:熟悉 Python 的生成器
- 建议67:基于生成器的协程及 greenlet
- 建议68:理解 GIL 的局限性
- 建议69:对象的管理与垃圾回收
- 第7章 使用工具辅助项目开发
- 第8章 性能剖析与优化
建议80:借助性能优化工具
“工欲善其事,必先利其器”,好的工具能够对性能的提升起到非常关键的作用。常见的性能优化工具有Psyco、Pypy和cPython等。本节我们将简单讨论前两者,cPython性能优化具体使用见建议90一节。
(1)Psyco
Psyco是一个just-in-time的编译器,它能够在不改变源代码的情况下提高一定的性能,Psyco将操作编译成部分优化的机器码,其操作分成三个不同的级别,有“运行时”、“编译时”和“虚拟时”变量,并根据需要提高和降低变量的级别。运行时变量只是常规Python解释器处理的原始字节码和对象结构。一旦Psyco将操作编译成机器码,那么编译时变量就会在机器寄存器和可直接访问的内存位置中表示。同时Python能高速缓存已编译的机器码以备以后重用,这样能节省一点时间。但Psyco也有其缺点,如,其本身运行所占内存较大。2012年3月12日,Psyco项目主页上宣布Psyco停止维护并正式结束,由Pypy所接替。到结束为止,Psyco也没有提供对Python2.7版本的支持。对Psyco感兴趣的读者可以参考其主页(http://psyco.sourceforge.net/)了解更多信息。
(2)Pypy
Python的动态编译器,是Psyco的后继项目。其目的是,做到Psyco没有做到的动态编译。Pypy的实现分为两部分:第一部分“用Python实现的Python”,这里虽然是这么说,但实际上它是使用一个名为RPython的Python子集实现的,Pypy能够将Python代码转成C、.NET、Java等语言和平台的代码;第二部分Pypy集成了一种编译rPython的即时(JIT)编译器,和许多编译器、解释器不同,这种编译器不关心Python代码的词法分析和语法树,因为它是用Python语言写的,所以它直接利用Python语言的Code Object(Python字节码的表示),也就是说,Pypy直接分析Python代码所对应的字节码,这些字节码既不是以字符形式也不是以某种二进制格式保存在文件中。如图8-1所示是针对同一段代码分别使用Python和Pypy运行得到的时间消耗示意图。
从图8-1中可见看出,使用Pypy来编译和运行程序,随着运算规模的扩大,其效率显著提高。
图8-1 Python与Pypy运行时间比较
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论