第12章 性能优化、性能分析与并发性
“过早优化是祸根。”
——Donald Knuth,著名的计算机科学家和数学家
在实际的应用中,性能与功能特性、健壮性、可维护性、可测性以及可用性等是一样重要的。此外,性能与应用程序的可扩展性成正比。因此,性能是本书中一个不可或缺的一个话题。这也是我们把性能这个主题放到最后来讲的原因之一。在这里,我们将性能分析(Profling)作为关键技术,介绍如何改善软件的性能。对于分布式多核系统,我们也会介绍相应的性能优化框架。
本章将讨论以下主题。
- 代码的性能分析(Profling)
- 安装Cython
- 调用C代码
- 利用multiprocessing创建进程池
- 通过Joblib提高for循环的并发性
- 比较Bottleneck函数与NumPy函数
- 通过Jug实现MapReduce
- 安装MPI for Python
- IPython Parallel
12.1 代码的性能分析
所谓性能分析,就是以收集程序运行时的信息为手段,找出代码中哪些部分较慢或者占用内存或处理器资源较多,以便进一步对这些代码做出相应的调整。这里,我们将以第9章中的情绪分析代码为蓝本,稍作修改后,以此为例进行性能分析。对于这个程序,我们将按照多进程编程准则对其进行重构。本章后面的部分将对多进程技术展开进一步讨论。
此外,我们会对停用词的过滤做进一步简化。最后,我们还会在不降低准确性的前提下,来进一步减少作为特征的单词。对于最后这一点,效果最显著。原始代码的运行时间大约需要20s。而新的代码,其速度将会有明显提升,同时我们将它作为本章的比较基准。某些代码修改与性能分析有关,这将在本节后面讲解。下列代码摘自本书代码包中的prof_demo.py文件。
import random from ...
Get Python数据分析(第2版) now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.