赵走x博客
网站访问量:151564
首页
书籍
软件
工具
古诗词
搜索
登录
Python性能分析与优化:8、line_profiler
Python性能分析与优化:7、性能分析示例
Python性能分析与优化:6、性能分析器:cProfile
Python性能分析与优化:5、性能分析最佳实践
Python性能分析与优化:4、运行时间复杂度
Python性能分析与优化:3、内存消耗和内存泄漏、过早优化的风险
Python性能分析与优化:2、性能分析可以分析什么
Python性能分析与优化:5、性能分析最佳实践
资源编号:75725
书籍
Python性能分析与优化
热度:97
性能分析是重复性的工作。为了获得最佳性能,你可能需要在一个项目中做很多次性能分析,在另一个项目里还要再做一次。和软件开发中的其他重复性任务一样,有许多最佳实践可以帮助你高效地完成大多数性能分析工作。让我们来具体看看。
## **1.7 性能分析最佳实践** 性能分析是重复性的工作。为了获得最佳性能,你可能需要在一个项目中做很多次性能分析,在另一个项目里还要再做一次。和软件开发中的其他重复性任务一样,有许多最佳实践可以帮助你高效地完成大多数性能分析工作。让我们来具体看看。 ### **1.7.1 建立回归测试套件** 在进行性能优化时,需要保证不管代码怎么变化,功能都不会变糟。最好的做法,尤其是面对大型项目时,就是建立测试套件。确保代码具有足够的覆盖率,可以让你信心去优化。覆盖率只有60%的测试套件在优化时可能会导致严重后果。 回归测试套件可以保证你在代码中尝试任何优化时,都不用担心代码的结构被破坏。 ### **1.7.2 思考代码结构** 函数代码之所以容易进行重构(refactor),是因为这种代码结构没有副作用。这样可以降低改变系统中其他部分的风险。如果你的代码没有局部可变的状态,将是另一个优势。这是因为,代码应该很容易理解和改变。没有按照前面的规则编写的代码,在重构过程中可能都需要额外的工作和注意。 ### **1.7.3 耐心** 性能分析不是一个快速、简单、精确的过程。也就是说,你不能指望运行一下性能分线器就可以把问题找到。有时候也许可以这样。但是,大多数情况下,你遇到的问题都不是很容易解决的。这就表明你必须浏览数据,描绘图形以便理解,不断地缩小检测范围,直到你重新开启新一轮分析,或者最终找到问题所在。 值得注意的是,对数据分析得越深入,表明你陷入的坑越深,数据将无法指明正确的优化方向,因此要时刻清楚自己的目标,并且在你开始之前已准备好正确的工具。然而,也可能搞了半天除了备受挫折,什么进展也没有。 ### **1.7.4 尽可能多地收集数据** 根据软件的不同类型和规模,在分析之前,你可能需要获取尽量多的数据。性能分析器很适合做这件事。但是,还有其他数据资源,如网络应用的系统日志、自定义日志、系统资源快照(如操作系统任务管理器),等等。 ### **1.7.5 数据预处理** 当你拥有了性能分析器的信息、日志和其他资源之后,在分析之前可能需要对数据进行预处理。不要因为性能分析器不能理解就回避非结构化数据。数据分析会往往从其他数据中受益。 例如,如果分析网络应用的性能,获取网络服务器日志是个不错的主意,但是这些日志文件就是一行一个请求。解析文件并把数据存入数据库系统(像MongoDB、MySQL等),你就可以为数据确定含义(解析日期数据,通过IP获溯源地理位置等),并在后面进行查询。 前面这个过程称为ETL(extracting the data from it's sources, transforming it into something with meaning, and loading it into another system),表示从源抽取数据,根据数据含义转换形式,并加载到其他系统中使用。 ### **1.7.6 数据可视化** 如果在错误发生之前,你不清楚自己要找的问题,只是想知道优化代码的方式,那么洞察你已经预处理过的数据的最好方式就是数据可视化。计算机很擅长处理数据,但是人类擅于通过图像来发现模式和理解现有信息中的某种特征。 例如,继续前面的网络服务器日志示例,一个简单的请求时间图(比如在微软的Excel中绘制)就可以显示客户行为的某种特征:  上图很清晰地显示出客户访问集中在下午晚些时候,并持续到深夜。后面你可以进一步针对这个特征进行性能分析。例如,针对这种现象的优化方案,可能就是在高峰期为基础设施增加更多资源(像亚马逊的AWS可以满足这类需求)。 另一个例子是用自定义性能分析数据可以画出下图:  上图是对本章第一个代码示例的性能分析结果中那些触发`profile`函数的事件进行数量统计。我们可以把它画成饼图,直观地看出数量最多的事件。可以看出,调用`call`和`return`占用了程序运行的绝大多数时间。 ## **1.8 小结** 在这一章,我们介绍了性能分析的基础知识,理解了性能分析方法及其重要性,并学会了如何使用它分析大多数代码的性能。 下一章我们将动手试试Python的性能分析器,看看它们是如何对应用进行性能分析的。