这本书的目的是帮助你在Python生态系统中编写更高效的应用程序。所谓更高效,我的意思是你的代码将使用更少的CPU周期、更少的存储空间和更少的网络通信。本书对性能问题采取了全面的方法。我们不仅讨论了纯Python中的代码优化技术,还考虑了广泛使用的数据库的高效使用,如NumPy和pandas。因为在某些情况下Python的性能不足,所以当我们需要更高的速度时,我们也会考虑使用Cython。与这种全面的方法相一致,我们还讨论了硬件对代码设计的影响:我们分析了现代计算机架构对算法性能的影响。我们还研究了网络架构对效率的影响,并探讨了使用GPU计算进行快速数据分析的用法。 这本书的章节基本上是独立的,你可以跳到对你来说重要的任何章节。话虽如此,这本书分为四个部分。第一部分,基础方法(第1-4章),涵盖了入门材料。 ■ 第1章介绍了这个问题,并解释了为什么我们必须关注计算和存储的效率。它还介绍了本书的方法,并为根据你的需求浏览它提供了建议。 ■ 第2章涵盖了原生Python的优化。我们还讨论了Python数据结构、代码分析、内存分配和延迟编程技术的优化。 ■ 第3章讨论了Python中的并发和并行,并介绍了如何最好地利用多进程和多线程(包括使用线程进行并行处理时的限制)。这一章还涉及了异步处理作为一种高效处理多个并发请求的方式,这种请求的工作量低,典型的是网络服务。 ■ 第4章介绍了NumPy,这是一个允许你高效处理多维数组的库。NumPy是所有现代数据处理技术的核心,因此,它被视为一个基本库。这一章分享了特定的NumPy技术来开发更高效的代码,如视图、广播和数组编程。 第二部分,硬件(第5和6章),主要关注如何从常用硬件和网络中提取最大效率。
■ 第5章涵盖了Cython,这是一个超集Python,可以生成非常高效的代码。Python是一个高级的解释型语言,因此,它不是为硬件优化的。有几种语言,如C或Rust,是设计来在硬件层面尽可能高效的。Cython属于这类语言:虽然它非常接近Python,但它编译成C代码。生成最高效的Cython代码需要注意代码如何映射到高效的实现。在这一章中,我们学习如何创建高效的Cython代码。
■ 第6章讨论了现代硬件架构对设计高效Python代码的影响。考虑到现代计算机的设计方式,一些反直觉的编程方法可能比预期的更高效。例如,在某些情况下,处理压缩数据可能比处理未压缩数据更快,即使我们需要支付解压缩算法的代价。这一章还涵盖了CPU、内存、存储和网络对Python算法设计的影响。我们讨论NumExpr,一个可以通过使用现代硬件架构的属性使NumPy代码更高效的库。
第三部分,现代数据处理的应用和库(第7和8章),看看在现代数据处理中使用的典型应用和库。 ■ 第7章集中讨论如何尽可能高效地使用pandas,这是Python中使用的数据帧库。我们将看到与pandas相关的技术来优化代码。与本书中的大多数章节不同,这一章是基于之前的章节建立的。pandas是基于NumPy的,所以我们将从第4章中学到的内容中提取,并发现与NumPy相关的技术来优化pandas。我们还探讨如何使用NumExpr和Cython优化pandas。最后,我介绍Arrow,这是一个库,它可以用来提高处理pandas数据帧的性能。 ■ 第8章研究数据持久性的优化。我们讨论Parquet,一个可以高效处理列式数据的库,以及Zarr,它可以处理非常大的磁盘数组。我们还开始讨论如何处理比内存大的数据集。 第四部分,高级主题(第9和10章),处理两个最后的、非常不同的方法:使用GPU和使用Dask库。 ■ 第9章看看如何使用图形处理单元(GPUs)来处理大数据集。我们将看到GPU计算模型——使用许多简单的处理单元——非常适合处理现代数据科学问题。我们使用两种不同的方法来利用GPU。首先,我们将讨论提供与你所知的库类似的接口的现有库,如CuPy作为NumPy的GPU版本。其次,我们将讨论如何从Python生成运行在GPU上的代码。 ■ 第10章讨论Dask,这是一个允许你编写并行代码的库,它可以扩展到许多机器——无论是在本地还是在云中——同时提供与NumPy和pandas类似的熟悉接口。