第 1 章. 了解 Performant Python
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
计算机编程可以理解为移动数据位,并以特殊方式对其进行转换,以实现特定的结果。然而,这些操作都需要时间成本。因此,高性能编程可以被认为是通过减少开销(即编写更高效的代码)或改变我们进行这些操作的方式(即找到更合适的算法)来尽量减少这些操作的行为。
让我们集中精力减少代码中的开销,以便更深入地了解我们移动这些比特的实际硬件。这看似徒劳无功,因为 Python 非常努力地抽象掉了与硬件的直接交互。然而,通过了解比特在实际硬件中移动的最佳方式,以及 Python 的抽象迫使比特移动的方式,您就能在用 Python 编写高性能程序方面取得进展。
基本计算机系统
构成计算机的基本组件可简化为三个基本部分:计算单元、存储单元以及它们之间的连接。此外,每个单元都有不同的属性,我们可以利用这些属性来理解它们。计算单元的属性是每秒能进行多少次计算,内存单元的属性是能容纳多少数据以及读写数据的速度,最后,连接单元的属性是能以多快的速度将数据从一个地方移动到另一个地方。
利用这些构件,我们可以从多个复杂层面来讨论标准工作站。例如,我们可以认为标准工作站有一个中央处理器(CPU)作为计算单元,与随机存取存储器(RAM)和硬盘驱动器这两个独立的存储单元相连(每个单元的容量和读写速度各不相同),最后还有一条总线提供所有这些部件之间的连接。 不过,我们还可以更详细地了解一下,CPU 本身就有几个内存单元:L1、L2,有时甚至还有 L3 和 L4 缓存,它们的容量很小,但速度却非常快(从几千字节到十几兆字节不等)。此外,新的计算机架构一般都会有新的配置(例如,英特尔的 SkyLake CPU 用英特尔超路径互连取代了前端总线,并重组了许多连接)。 最后,在上述两种工作站近似模型中,我们都忽略了网络连接,而网络连接实际上是与潜在的许多其他计算和内存单元的非常缓慢的连接!
为了帮助解开这些错综复杂的问题,让我们来简要介绍一下这些基本模块。
计算单位
计算机的计算单元是计算机功能的核心--它能够将接收到的任何比特转化为其他比特,或改变当前进程的状态。中央处理器是最常用的计算单元;然而,图形处理单元(GPU)作为辅助计算单元越来越受欢迎。图形处理器最初用于加快计算机图形处理速度,但现在越来越适用于数值应用,由于其本质上的并行性,可以同时进行许多计算,因此非常有用。 无论其类型如何,计算单元都是接收一系列比特(例如,代表数字的比特)并输出另一组比特(例如,代表这些数字之和的比)。除了对整数和实数进行基本算术运算以及对二进制数进行位运算外,一些计算单元还提供非常专业的运算,例如 "融合乘加 "运算,它输入三个数A 、B 和C ,并返回值A * B + C 。
计算单元的主要特性是一个周期内可执行的操作数和一秒钟内可执行的周期数。前者用每周期指令数(IPC)来衡量、1而后一个值则由时钟速度来衡量。在制造新的计算单元时,这两个指标总是相互竞争。例如,英特尔酷睿系列具有极高的 IPC,但时钟速度较低,而奔腾 4 芯片则相反。另一方面,GPU 具有极高的 IPC 和时钟速度,但也存在其他问题,例如我们在 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access