Python性能分析与优化[试读]
1.1 什么是性能分析
就像在12秒内跑完100米障碍跑的人在婴儿时期需要先学爬一样,程序员在精通性能分析(profiling)之前需要先了解一些基础知识。因此,在我们探索Python程序的性能优化与分析技术之前,需要对相关的基础知识有一个清晰的认识。 只要你掌握了这些基础知识,就可以进一步学习具体的工具和技术。因此,这一章将介绍所有你平时羞于开口问人却又应该掌握的性能分析知识。本章的具体内容如下。 介绍性能分析的明确定义,概述各种性能分析技术。 论述性能分析在开发周期中的重要作用,因为性能分析不是那种只做一次就抛到脑后的事情。性能分析应该是开发过程中一个完整的组成部分,就像写测试一样。 介绍哪些... 查看全部[ 1.1 什么是性能分析 ]
1.2 性能分析的重要性
现在我们已经知道了性能分析的涵义,还应该理解在产品开发周期中进行性能分析的重要性和实际意义。 性能分析并不是每个程序都要做的事情,尤其对于那些小软件来说,是没多大必要的(不像那些杀手级嵌入式软件或专门用于演示的性能分析程序)。性能分析需要花时间,而且只有在程序中发现了错误的时候才有用。但是,仍然可以在此之前进行性能分析,捕获潜在的bug,这样可以节省后期的程序调试时间。 在硬件变得越来越先进、越来越快速且越来越便宜的今天,开发者自然也越来越难以理解,为什么我们还要消耗资源(主要是时间)去对开发的产品进行性能分析。毕竟,我们已经拥有测试驱动开发、代码审查、结对编程,以及其他让代码更加可靠且符... 查看全部[ 1.2 性能分析的重要性 ]
1.3 性能分析可以分析什么
要想深入地理解性能分析,很重要的一点是明白性能分析方法究竟能够分析什么指标。因为测量是性能分析的核心,所以让我们仔细看看程序运行时可以测量的指标。 1.3.1 运行时间 做性能分析时,我们能够收集到的最基本的数值就是运行时间。整个进程或代码中某个片段的运行时间会暴露相应的性能。如果你对运行的程序有一些经验(比如说你是一个网络开发者,正在使用一个网络框架),可能很清楚运行时间是不是太长。例如,一个简单的网络服务器查询数据库、响应结果、反馈到客户端,一共需要100毫秒。但是,如果程序运行得很慢,做同样的事情需要花费60秒,你就得考虑做性能分析了。你还需要考虑不同场景的可比性。再考虑另一个进程:... 查看全部[ 1.3 性能分析可以分析什么 ]
1.4 内存消耗和内存泄漏
软件开发过程中需要考虑的另一个重要资源是内存。一般的软件开发者不会意识到这一点,因为640KB RAM电脑的时代早已成为过去。但是一个内存泄漏的程序会把服务器糟蹋成640KB电脑。内存消耗不仅仅是关注程序使用了多少内存,还应该考虑控制程序使用内存的数量。 有一些开发项目,比如嵌入式系统开发,就会要求开发者关注内存配置,因为这类系统的资源是相当有限的。但是,普通开发者总希望目标系统能够提供他们需要的RAM。 随着RAM和高级编程语言都开始支持自动内存管理(比如垃圾回收机制),开发者不需要关注内存优化了,系统会帮忙完成的。 跟踪程序内存的消耗情况比较简单。最基本的方法就是使用操作系统的任务管... 查看全部[ 1.4 内存消耗和内存泄漏 ]
1.5 过早优化的风险
优化通常被认为是一个好习惯。但是,如果一味优化反而违背了软件的设计原则就不好了。在开始开发一个新软件时,开发者经常犯的错误就是过早优化(permature optimization)。 如果过早优化代码,结果可能会和原来的代码截然不同。它可能只是完整解决方案的一部分,还可能包含因优化驱动的设计决策而导致的错误。 一条经验法则是,如果你还没有对代码做过测量(性能分析),优化往往不是个好主意。首先,应该集中精力完成代码,然后通过性能分析发现真正的性能瓶颈,最后对代码进行优化。... 查看全部[ 1.5 过早优化的风险 ]
1.6 运行时间复杂度
在进行性能分析和优化时,理解运行时间复杂度(Running Time Complexity,RTC)的知识,以及学习使用它们适当地优化代码十分重要。 RTC可以用来对算法的运行时间进行量化。它是对算法在一定数量输入条件下的运行时间进行数学近似的结果。因为是数学近似,所以我们可以用这些数值对算法进行分类。 RTC常用的表示方法是大O标记(big O notation)。数学上,大O标记用于表示包含无限项的函数的有限特征(类似于泰勒展开式)。如果把这个概念用于计算机科学,就可以把算法的运行时间描述成渐进的有限特征(数量级)。 也就是说,这种标记通过宽泛的估计,让我们了解算法在任意数量输入下的... 查看全部[ 1.6 运行时间复杂度 ]
1.7 性能分析最佳实践
性能分析是重复性的工作。为了获得最佳性能,你可能需要在一个项目中做很多次性能分析,在另一个项目里还要再做一次。和软件开发中的其他重复性任务一样,有许多最佳实践可以帮助你高效地完成大多数性能分析工作。让我们来具体看看。 1.7.1 建立回归测试套件 在进行性能优化时,需要保证不管代码怎么变化,功能都不会变糟。最好的做法,尤其是面对大型项目时,就是建立测试套件。确保代码具有足够的覆盖率,可以让你信心去优化。覆盖率只有60%的测试套件在优化时可能会导致严重后果。 回归测试套件可以保证你在代码中尝试任何优化时,都不用担心代码的结构被破坏。 1.7.2 思考代码结构 函数代码之所以容易进行重构... 查看全部[ 1.7 性能分析最佳实践 ]
1.8 小结
在这一章,我们介绍了性能分析的基础知识,理解了性能分析方法及其重要性,并学会了如何使用它分析大多数代码的性能。 下一章我们将动手试试Python的性能分析器,看看它们是如何对应用进行性能分析的。... 查看全部[ 1.8 小结 ]
书名: Python性能分析与优化
作者: Fernando Doglio
出版社: 人民邮电出版社
原作名: Mastering Python High Performance
译者: 陶俊杰 | 陈小莉
出版年: 2016-6-1
页数: 178
定价: 45.00元
装帧: 平装
ISBN: 9787115424228