我一直在检查函数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的大小小于其他整数。尽管我可以在向列表或字符串中添加更多元素时找出一种模式,但我不理解为什么字典的大小相同,无论其键/值对的数量为何。
答案 0 :(得分:1)
我不明白为什么0的大小小于其他整数。
我假设整数对象存储表示整数所需的int
数量,然后是那么多int
。所以0会比其他数字小,因为它可以用0 int
来表示。因此,一旦找到不适合单个int
的数字,大小就会再次增加。
我不明白为什么字典的大小相同,无论它具有多少个键值对。
对于dict
来说,可能是因为哈希映射中数组的大小(Python的dict
是)大于元素数。通常,它以某个默认大小开始,然后在达到给定阈值时(例如,已满70%)加倍。达到一定数量的元素后,您会发现大小会增加。
如果通过重复添加列表而不是创建一定大小的列表来创建列表,则会观察到类似的行为。也就是说,如果您从一个空列表开始,然后在循环中追加到列表中,同时在每次追加之后打印大小,您会发现大小只会增加一些。这是因为基础数组不会在每次追加时都被调整大小,而是在其满时将其大小增加一倍,因此每次调整大小后必须调整大小的时间将增加一倍(这将使附加的摊销O(1)时间而不是O (n))。