Python中_sizeof_()和getsizeof()方法的区别

2025年1月5日 | 阅读 5 分钟

Python 是一种多功能、动态类型的编程语言,为开发人员提供了海量的内置函数和方法来方便地执行各种任务。当涉及评估对象内存使用量时,常用的方法有两种:__sizeof__() 和 getsizeof()。虽然它们乍一看可能很相似,但存在细微的差别,开发人员需要了解这些差别才能有效地管理其 Python 应用程序中的内存。

Python 中的内存管理基础

在深入探讨 __sizeof__() 和 getsizeof() 的具体细节之前,让我们先建立对 Python 内存管理的基本理解。Python 通过一种称为垃圾回收的机制来实现自动内存管理。这意味着开发人员无需显式地分配或取消分配内存;解释器会负责这些操作。

然而,理解内存使用量至关重要,尤其是在内存优化是优先事项的情况下。Python 提供了检查对象内存使用量的工具,其中两个工具就是 __sizeof__() 和 getsizeof()。

__sizeof__() 方法

__sizeof__() 方法是 Python 中的一个特殊方法,在对象上调用该方法以返回该对象的大小(以字节为单位)。此方法是 Python 中的魔术方法(或双下划线方法)协议的一部分,通过在方法名称前后使用双下划线来表示。

以下是一个简单的示例来说明 __sizeof__() 的用法:

输出

Size of the object: 28 bytes

在此示例中,__sizeof__() 方法在 Example 类的 obj 实例上调用,以获取对象的大小(以字节为单位)。需要注意的是,__sizeof__() 并非仅限于内存,其实现取决于对象类型。

getsizeof() 函数

与 __sizeof__() 不同,getsizeof() 函数是 sys 模块的一部分,专门用于以字节为单位获取对象的大小。此函数比 __sizeof__() 更通用,因为它可以处理更广泛的对象,包括内置类型,并且它会考虑给定对象引用的对象的大小。

让我们来看一个使用 getsizeof() 的示例:

输出

Size of the object: 52 bytes

在此示例中,使用 getsizeof() 函数检索 obj 实例的大小。与 __sizeof__() 不同,getsizeof() 提供了对象内存占用的更全面视图,它会考虑对象引用的对象的大小。

关键区别

现在我们已经对 __sizeof__() 和 getsizeof() 有了基本了解,接下来深入探讨它们之间的主要区别。

1. 对引用对象的处理

主要区别之一在于这些方法如何处理主对象引用的对象。__sizeof__() 只考虑了对象本身的大小,而 getsizeof() 通过递归计算主对象内部引用的对象的大小,提供了一个更全面的度量。这使得 getsizeof() 在处理复杂数据结构时更加通用。

输出

Size with __sizeof__(): 104 bytes
Size with getsizeof(): 136 bytes

在此示例中,getsizeof() 同时考虑了列表的大小以及其中包含的整数的大小,提供了对总内存占用的更准确的表示。

2. 兼容性和对象类型处理

__sizeof__() 由每个对象类型单独实现,并且其行为可能因特定类型而异。另一方面,getsizeof() 是 Python 标准库提供的更通用的函数,使其与更广泛的对象兼容。

输出

Size with __sizeof__(): 28 bytes
Size with getsizeof(): 52 bytes

在此示例中,__sizeof__() 可能无法为自定义类提供有意义的信息,而 getsizeof() 可以无缝处理它。

3. 实现和自定义

__sizeof__() 是一个可以由单个类实现的类方法,用于定义计算大小的自定义逻辑。这允许在类级别进行自定义。另一方面,getsizeof() 是 Python 标准库提供的函数,其行为在所有对象中都是一致的。

输出

Custom size with __sizeof__(): 24 bytes
Custom size with getsizeof(): 72 bytes

在此示例中,CustomExample 类实现了具有自定义逻辑的 __sizeof__(),允许开发人员根据自己的需求定制大小计算。

何时使用每种方法

在 __sizeof__() 和 getsizeof() 之间进行选择取决于具体用例和内存分析所需的详细程度。

在以下情况下使用 __sizeof__():

您需要一种快速轻量级的方法来进行基本内存检查。

自定义类具有自己的 __sizeof__() 实现,可提供有意义的大小信息。

在以下情况下使用 getsizeof():

您希望更全面地了解对象内存占用情况,包括引用对象。

您正在处理各种数据结构,并且偏好统一的大小计算方法。

结论

在 Python 内存管理的领域,了解如何测量对象的大小对于构建高效的应用程序至关重要。__sizeof__() 方法和 getsizeof() 函数可用于此目的,它们各有优缺点和适用场景。通过掌握这些工具的细微差别,开发人员可以就内存优化做出明智的决定,并确保其 Python 应用程序的健壮性。