Python 中的sizeof

发布时间:2022-07-24

当我们编写大型脚本或多行代码时,内存管理应该是我们的首要任务。因此,除了良好的编程知识外,我们还应该具备高效处理内存的良好知识。Python 中给出了许多函数来获取程序中特定对象的内存大小,其中一个函数是 sizeof()。在本教程中,我们将学习 sizeof 函数及其在 Python 程序中的工作。

Python sizeof() 函数

Python 中的 sizeof() 函数并没有准确地告诉我们对象的大小。它不返回生成器对象的大小,因为 Python 无法事先告诉我们生成器的大小。然而,实际上,它返回占用内存的特定对象的内部大小(以字节为单位)。 为了理解这一点,让我们来看看下面的示例程序,它有一个无穷无尽的生成器对象。

示例 1: 看看下面的 Python 程序:

# A default function with endless generator object in it
def endlessGenerator():
    # A counting variable to initialize the generator
    counting = 0
    # Using while loop to create an endless generator
    while True:
             yield counting
             counting += 1 # Creating infinite loop
# Printing memory size of a generator object
print("Internal memory size of endless generator object: ", endlessGenerator.__sizeof__())

输出

Internal memory size of endless generator object:  120

说明: 我们使用了一个默认函数,即 endlessGenerator(),在程序中创建了一个无穷无尽的生成器对象。在函数中,我们已经初始化了一个变量,即 counting = 0。我们在计数变量上使用了 While 循环,但没有在循环上设置断点。通过在函数中创建一个无限循环,我们将默认函数作为一个无限生成器对象。最后,我们使用 sizeof() 函数打印了循环生成器对象的内存大小。 现在,我们可以清楚地了解 sizeof() 函数的功能。由于上述程序中的无尽生成器对象没有任何结束或断点,Python 无法事先告诉我们生成器的大小。但与此同时,我们可以通过 sizeof() 函数检查分配给生成器对象的内部内存大小,因为它在 Python 中必须占用一些内部内存。 让我们再看一个例子,其中我们使用 sizeof() 函数来获取内部内存大小,而没有任何开销。

示例 2:

# Define an empty list in the program
emptyList = []
# Printing size of empty list
print("Internal memory size of an empty list: ", emptyList.__sizeof__())
# Define some lists with elements
a = [24]
b = [24, 26, 31, 6]
c = [1, 2, 6, 5, 415, 9, 23, 29]
d = [4, 5, 12, 3, 2, 9, 20, 40, 32, 64]
# Printing internal memory size of lists
print("Memory size of first list: ", a.__sizeof__())
print("Memory size of second list: ", b.__sizeof__())
print("Memory size of third list: ", c.__sizeof__())
print("Memory size of fourth list: ", d.__sizeof__())

输出

Internal memory size of an empty list:  40
Memory size of first list:  48
Memory size of second list:  104
Memory size of third list:  104
Memory size of fourth list:  136

说明: 使用 sizeof() 函数,我们可以清楚地看到,一个空列表的内部内存大小是 40 字节,列表中的每个元素都会将列表的总内存大小增加 8 字节。