这是Python3.8.0解释器中的一个示例(但是,它在3.7.5中类似)
>>> import sys
>>> sys.getsizeof(int)
416
>>> sys.getsizeof(float)
416
>>> sys.getsizeof(list)
416
>>> sys.getsizeof(tuple)
416
>>> sys.getsizeof(dict)
416
>>> sys.getsizeof(bool)
416getsizeof()返回Python对象与垃圾收集器开销一起消耗的字节数(参见这里)。基本python类消耗同样数量的内存的原因是什么?
如果我们看一下这些类的实例
>>> import sys
>>> sys.getsizeof(int())
24
>>> sys.getsizeof(float())
24默认参数是0,这两个实例对此参数的内存使用量相同。但是,如果我试图添加一个参数
>>> sys.getsizeof(int(1))
28
>>> sys.getsizeof(float(1))
24这就是奇怪的地方。为什么int类型的实例内存使用量增加,而浮点类型的实例内存使用量却没有增加?
发布于 2019-12-15 10:36:26
简而言之,这一切归结为Python如何表示任意长整数。float()类型表示(有限)为C double。
在CPython实现中,每个对象(来源)都以引用计数和指向该对象的类型对象的指针开始。那是16个字节
浮点对象将其数据存储为C double (来源),即8个字节。所以16 +8=浮点对象的24字节。
对于整数,情况更加复杂。整数对象被表示为可变大小的对象(来源),它为16个字节添加了另外8个字节。数字表示为数组。根据平台的不同,Python使用具有30位位数的32位无符号整数数组或具有15位位数的16位无符号整数数组。所以对于小整数,数组中只有一个32位整数,所以再添加4个字节= 16 +8+4= 28字节。
如果要表示较大的整数,则大小将增加:
sys.getsizeof(int(2**32)) # prints 32 (24 + 2*4 bytes)
sys.getsizeof(int(2**64)) # prints 36 (24 + 3*4 bytes)编辑:
使用sys.getsizeof(int),您将得到类的大小,而不是类实例的大小。float,bool,.
print(type(int)) # prints <class 'type'>如果你查看一下来源,就会发现引擎盖下面有很多东西。在我的Python3.6.9(Linux/64位)版本中,它会打印400个字节。
发布于 2019-12-15 10:27:36
看看医生们,重要的是要注意到:
只计算直接归因于对象的内存消耗,而不是它所引用的对象的内存消耗。
那么,从sys.getsizeof(int(1))的返回值大于sys.getsizeof(float(1))的返回值这一事实可以推断出什么呢?
简单地说,表示int比表示float需要更多的内存。这令人惊讶吗?如果我们可以期望用int“做更多的事情”而不是用float“做更多的事情”,那么也许不会。我们可以通过查看其属性的数量来衡量“功能的数量”:
>>> len(dir(int))
70
>>> len(dir(float))
57https://stackoverflow.com/questions/59342632
复制相似问题