4.1.9 内存
和运行时间一样,程序的内存使用与物理世界直接关联:计算机的大量电路使程序可以存储值并随后访问这些值。在给定时间内,你需要存储的值越多,则需要的电路越多。如果要关注成本,就必须关注内存的使用情况。你也许已经意识到计算机内存使用的一些限制(有时候甚至比时间更重要),因为你可能需要花费更多的钱购买额外的内存条。
在一开始,你就应该意识到Python语言的纯面向对象程序设计方法(一切皆对象,甚至布尔值也被视为对象)带来的灵活性是有代价的,其中一种最主要的代价是内存消耗。通过分析若干特定的例子,我们将更深刻地理解这个概念。
计算机上的Python内存使用有严格的定义(每次当你运行程序时,每个值均占用同样的内存空间),但是Python可以在许多计算机设备上实现,并且内存消耗与实现有关。不同版本的Python可能使用不同方法实现同一种数据类型。为了简单起见,我们使用“典型的”(typical)这个词语来表示特别与机器相关的值。分析内存使用状况与分析时间使用状况有些不同,主要因为Python的最重要功能特征之一就是内存分配系统,其设计目标是减轻管理内存的繁重工作。当然,建议读者在适当的时候尽可能充分利用这种功能。而且,你还有责任了解,或者至少是大致了解,内存需求可能会在什么时候妨碍用户解决给定的问题。
计算机内存被划分为字节,每个字节包含8位,每个位是单个二进制位。要确定一个Python程序的内存使用情况,我们统计程序使用的对象数量,然后根据对象的类型乘以各对象占用的字节数。要使用这种方法,我们必须知道给定类型的一个对象所占用的字节数。要确定一个对象的内存消耗,我们累计其实例变量占用的内存量以及与每个对象关联的开销。
Python并没有定义我们所使用的内置数据类型(int、float、bool、str和list)的大小。这些数据类型对象的大小在不同的系统中各不相同。因而,你创建的数据类型的大小在不同的系统中也各不相同,因为它们基于这些内置的数据类型。函数调用sys.getsizeof(x)返回一个内置数据类型x在你的系统中占用的字节数。在本节给出的数值是在典型的系统上,通过在交互式Python中使用这个函数收集到的观测值。建议读者在自己的计算机上尝试同样的操作! ...
Get 程序设计导论:Python语言实践 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.