sys.getsizeof如何在后台运行?

时间:2019-04-02 23:12:15

标签: python sys

我一直在检查函数sys.getsizeof,并且我知道这将返回正在传递的参数的大小(以字节为单位)。

我对C有一些经验,可以在知道某些类型的大小的情况下找出一些值的大小。我已经使用此功能进行了一些实验。

注意:我在macOS上使用Python 3.7.3运行以下命令:

对于数字

>>> sys.getsizeof(0)
24
>>> sys.getsizeof(1)
28
>>> sys.getsizeof(-1)
28
>>> sys.getsizeof(1.0)
24
>>> sys.getsizeof(-1.0)
24

对于列表

>>> sys.getsizeof([])
64
>>> sys.getsizeof([1])
72
>>> sys.getsizeof([1.0])
72
>>> sys.getsizeof([0, 1])
80

对于字符串

>>> sys.getsizeof('d')
50
>>> sys.getsizeof('do')
51

对于字典

>>> sys.getsizeof({})
240
>>> sys.getsizeof({'a': 1})
240
>>> sys.getsizeof({'a': 1, 'b': 2})
240
>>> sys.getsizeof({'a': 1, 'b': 2, 'c': 3, 'd': 4})
240

我不明白为什么0的大小小于其他整数。尽管我可以在向列表或字符串中添加更多元素时找出一种模式,但我不理解为什么字典的大小相同,无论其键/值对的数量为何

1 个答案:

答案 0 :(得分:1)

  

我不明白为什么0的大小小于其他整数。

我假设整数对象存储表示整数所需的int数量,然后是那么多int。所以0会比其他数字小,因为它可以用0 int来表示。因此,一旦找到不适合单个int的数字,大小就会再次增加。

  

我不明白为什么字典的大小相同,无论它具有多少个键值对。

对于dict来说,可能是因为哈希映射中数组的大小(Python的dict是)大于元素数。通常,它以某个默认大小开始,然后在达到给定阈值时(例如,已满70%)加倍。达到一定数量的元素后,您会发现大小会增加。

如果通过重复添加列表而不是创建一定大小的列表来创建列表,则会观察到类似的行为。也就是说,如果您从一个空列表开始,然后在循环中追加到列表中,同时在每次追加之后打印大小,您会发现大小只会增加一些。这是因为基础数组不会在每次追加时都被调整大小,而是在其满时将其大小增加一倍,因此每次调整大小后必须调整大小的时间将增加一倍(这将使附加的摊销O(1)时间而不是O (n))。