从狭义相对论的角度看,速度最快、规模最大的并行计算方式是太阳照耀地球。每时每刻,阳光都会离开太阳表面,以大约30万千米/秒的速度,经过8分17秒到达地球表面。太阳的计算方式很简单,一视同仁,普照大地,并行(parallel)照耀每一个对象,谁也不会多得一米阳光。地球上的每个人都可看成享受阳光资源的独立进程(process),人们平时处理自己的任务,经历着各自的生命周期,彼此间有时也会通信(进程间通信,IPC)。由于太阳资源丰富,可以不计得失,她也许从来不觉得自己的光具有波粒二象性,也没觉得并行计算的效率高。
但是,人不是太阳,每个人在一生中时刻面对着诸多问题。“人无远虑,必有近忧”,本质上皆为时间与空间的稀缺问题,这与计算机的多任务处理问题一致。完成任务之前,需要精打细算,以期充分利用资源,尽可能地多快好省,实现高效运行。对于单任务,人们会努力提升自己的能力,并借助高性能的工具,提高做事的效率,从内部不断优化自己。对于多个简单任务,可以完成一个任务再去完成另一个任务,就像 for
循环处理方式。然而,“好汉难敌四手”,个人的力量总是有限的,所以时间紧迫、任务艰巨时,团队的力量(多进程)不可或缺。有时,在处理没有共同资源需求的多个任务时,可以多人同时作业,并行处理,提高效率。处理有共同资源需求的多个任务时,我们会为每个人设定不同的阶段性目标,在这段时间做点任务A,在那段时间做点任务B,也就是多线程的并发(concurrency)处理;这样,一段时间后,两个任务就都可以完成。然而,多进程与多线程,究竟哪种方式效率高、效果好,需要根据实际情况决定。
计算机多任务处理的理论,与上述情景类似。大师们已经将这些资源配置方法抽象成完整的理论,不仅适用于计算机编程语言,对提高个人素质和改善团队合作方式也大有裨益。众所周知,Python语言简洁优雅的特点,使其生产效率大幅提升,然而在面对海量的数据处理、文本分析、服务器响应时,其性能瓶颈也十分明显。但是,Python社区一直在努力,从语言自身的特性到计算机优化理论,特别是多任务处理(并行、并发、分布式)等方面,不断地改善Python的性能。本书即是社区对Python性能分析与优化实践的系统性总结之一。
本书内容丰富,浅显易懂,适合有Python基础的读者阅读。作者从算法性能分析理论开始,首先介绍主流的Python性能分析工具,包括cProfile性能分析器、line_profiler+kernprof性能分析工具、KCacheGrind+pyprof2calltree、RunSnakeRun可视化性能分析工具,帮助读者发现程序的性能瓶颈。紧接着,将通用性能优化方法与Python语言结构紧密结合起来,优化程序的性能,介绍了函数值缓存、列表生成器、ctypes和字符串优化等技巧。之后,介绍了Python多线程与多进程的多任务处理方法,并对PyPy(JIT编译器)与Cython(引入C语言类型)的用法与特点进行了深入分析。另外,针对Python在数据分析领域的重要地位,作者还专门介绍了高性能的数据处理程序库,如Numba、Parakeet和pandas。最后,作者通过一个Python网络爬虫案例,将前面介绍的性能分析与优化方法结合起来,不断地改善程序的性能,对比性能优化的效果。
优化Python也是需要成本的。写Python总是很happy,因为在普通的业务场景中,Python并不慢,再结合成熟的科学计算生态环境,问题大都可以轻松解决。虽然Python的性能分析与优化方法都很简单,但是优化也是需要花费时间的,所以大规模的性能优化需要面对特定的业务场景才有意义,正如不是所有人每天都需要跑100米冲刺,亦如Python的发明者Guido van Rossum所说,“……对绝大多数事情而言,语言性能并不重要……”(...for most of what you're doing, the speed of the language is irrelevant...)。假如你的Python程序总是需要优化,那么高性能部分代码可以考虑使用新语言实现,参考Google与Dropbox的发展轨迹。如果你有时间、想优化,那就动手吧,本书可以给你一些指导。不过,开源项目的发展速度不是书本可以跟上的,所以要想了解最新的进展,需要主动关注相关工具的官方网站或GitHub。书籍能够提供的是基础性、系统化的指导,知识可能过时,但方向不会改变。
Python生态系统的性能与时俱进。随着数据获取成本与云计算资源成本的不断降低,人们越来越容易获取强大的计算资源(如亚马逊AWS、微软Azure、谷歌云计算平台)。PEP不断地引入优质方案,增强Python的性能,Spark(支持Python)、dask、IPython的ipyparallel等并行计算框架也在快速发展,Python的生态系统性能不断地优化,精彩的故事正在进行,让我们共同努力吧(Let's do more of this)。
简单,所以持久。
——译者陶俊杰