首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python基类型(特别是int和浮点数)的内存使用情况

Python基类型(特别是int和浮点数)的内存使用情况
EN

Stack Overflow用户
提问于 2019-12-15 09:25:32
回答 2查看 6.7K关注 0票数 14

这是Python3.8.0解释器中的一个示例(但是,它在3.7.5中类似)

代码语言:javascript
复制
>>> 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)
416

getsizeof()返回Python对象与垃圾收集器开销一起消耗的字节数(参见这里)。基本python类消耗同样数量的内存的原因是什么?

如果我们看一下这些类的实例

代码语言:javascript
复制
>>> import sys
>>> sys.getsizeof(int())
24
>>> sys.getsizeof(float())
24

默认参数是0,这两个实例对此参数的内存使用量相同。但是,如果我试图添加一个参数

代码语言:javascript
复制
>>> sys.getsizeof(int(1))
28
>>> sys.getsizeof(float(1))
24

这就是奇怪的地方。为什么int类型的实例内存使用量增加,而浮点类型的实例内存使用量却没有增加?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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字节

如果要表示较大的整数,则大小将增加:

代码语言:javascript
复制
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),您将得到类的大小,而不是类实例的大小。floatbool,.

代码语言:javascript
复制
print(type(int))  # prints <class 'type'>

如果你查看一下来源,就会发现引擎盖下面有很多东西。在我的Python3.6.9(Linux/64位)版本中,它会打印400个字节。

票数 16
EN

Stack Overflow用户

发布于 2019-12-15 10:27:36

看看医生们,重要的是要注意到:

只计算直接归因于对象的内存消耗,而不是它所引用的对象的内存消耗。

那么,从sys.getsizeof(int(1))的返回值大于sys.getsizeof(float(1))的返回值这一事实可以推断出什么呢?

简单地说,表示int比表示float需要更多的内存。这令人惊讶吗?如果我们可以期望用int“做更多的事情”而不是用float“做更多的事情”,那么也许不会。我们可以通过查看其属性的数量来衡量“功能的数量”:

代码语言:javascript
复制
>>> len(dir(int))
70
>>> len(dir(float))
57
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59342632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档