首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么sys.getsizeof()返回的值比实际大小多33个字节?

sys.getsizeof()函数返回的值比实际大小多33个字节的原因是因为该函数返回的是对象占用的内存大小,而不仅仅是对象本身的大小。

在Python中,对象的内存大小由多个因素决定,包括对象本身的大小以及对象所引用的其他对象的大小。sys.getsizeof()函数计算的是对象占用的内存大小,包括对象本身的大小以及对象引用的其他对象的大小。

此外,Python解释器为了优化内存使用,会对对象的内存进行对齐和填充。这些对齐和填充的字节也会被计算在内存大小中,导致sys.getsizeof()返回的值比实际大小多出一些字节。

因此,sys.getsizeof()返回的值比实际大小多33个字节是正常的现象,这些额外的字节包括了对象引用的其他对象的大小以及对齐和填充的字节。

推荐的腾讯云相关产品:无

参考链接:

  • Python官方文档:https://docs.python.org/3/library/sys.html#sys.getsizeof
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python 内存分配时小秘密

本文将会频繁地使用该模块 getsizeof() 方法,因此,我先简要介绍一下: 该方法用于获取一个对象字节大小(bytes) 它只计算直接占用内存,而不计算对象内所引用对象内存 这里有个直观例子...对于我们熟知一些空对象,例如空字符串、空列表、空字典等等,不知道大家是否曾好奇过,是否曾思考过这些问题: 空对象是不是不占用内存呢?如果占内存,那占用多少呢?为什么是这样分配呢?...所以,这个秘密昭然若揭:在元素个数相等时,静态创建列表所占内存有可能小于动态扩容时内存! 也就是说,这两种列表看似相同,实际却不同!列表不等于列表! 4、消减元素并不会释放内存!...import sys a = [1, 2, 3, 4] sys.getsizeof(a) # 初始:96 a.append(5) # 扩充后:[1, 2, 3, 4, 5] sys.getsizeof...)竟然前面的空字典(240)要小很多!

44010

你所使用Python对象占用了多少内存?(附代码)

这可能是一个更为严格限制因素,因为这对缓存、虚拟内存、与其他程序租户产生了影响,而且通常会更快地耗尽一种稀缺且昂贵资源——可用内存。 事实证明,想要弄清楚实际消耗了多少内存并非易事。...该函数接收一个对象(和可选默认),调用sizeof()方法并返回结果,从而可以让你所使用对象具备可检查性。...sys.getsizeof函数仅执行较浅深度。不管它容器内每个对象实际大小,它都将其设为指针。...当一个10字节大小对象被分配时,它会从16字节池中分配出大小为9-16字节对象。因此,即便他只包含10字节数据,但它还是会花费16字节内存。...如果1,000,000个10字节大小对象被分配时,实际使用内存是16,000,000字节,而不是10,000,000个字节。这其中多出60%开销显然是微不足道

94430

Python 内存分配时小秘密

本文将会频繁地使用该模块getsizeof()方法,因此,我先简要介绍一下: 该方法用于获取一个对象字节大小(bytes) 它只计算直接占用内存,而不计算对象内所引用对象内存 这里有个直观例子...对于我们熟知一些空对象,例如空字符串、空列表、空字典等等,不知道大家是否曾好奇过,是否曾思考过这些问题: 空对象是不是不占用内存呢?如果占内存,那占用多少呢?为什么是这样分配呢?...所以,这个秘密昭然若揭:在元素个数相等时,静态创建列表所占内存有可能小于动态扩容时内存! 也就是说,这两种列表看似相同,实际却不同!列表不等于列表! 4、消减元素并不会释放内存!...import sys a = [1, 2, 3, 4] sys.getsizeof(a) # 初始:96 a.append(5) # 扩充后:[1, 2, 3, 4, 5] sys.getsizeof...)竟然前面的空字典(240)要小很多!

88731

Python: 浅析列表变长变短

然后实际上 list 真的就是这么 ”low“: import sys test = [] test_1 = [1] print sys.getsizeof(test) print sys.getsizeof...(test_1) - sys.getsizeof(test) # 输出 72 # 空列表内存大小,也是 list 对象大小 8 # 代表增加一个成员,list 增加大小 (...但是在上面的实验看出,一个成员列表,一个空列表,长度仅仅只是大了 8 字节(对象指针大小),如果真的存在这样一个预分配池,那么在预分配个数之内添加成员,两者内存大小应该是保持不变才对。...为什么我们需要这样关注 allocated?理由很简单,因为这个决定了整个 list 动态内存占用大小; 扩容是这样,缩容也是照猫画虎。...为什么推荐列表推导呢?

1.1K20

【Python】小谈numpy数组占用内存空间问题

之前跟同学讨论过numpy数组占用空间大小问题,但是今天给忘了,又重新试验了一下,主要是利用sys模块getsizeof函数,使用版本是 Python3.5。记录下来,以备后忘。...numpy 数组,无论什么类型,都是占用 96 个字节(byte)。...一个 int32 和一个 float32 都是占用 4 个字节,而64位都占用 8 个字节。 其他类型占用空间大小可以采用类似代码进行测试。...此外,注意 sys.getsizeof() 函数返回是 这个对象所占用空间大小,对于数组来说,除了数组中每个占用空间外,数组对象还会存储数组长度、数组类型等其他信息。...而如果只想要获取数组中存储占用空间大小,可以使用 numpy.ndarray.nbytes ,使用 numpy.ndarray.itemsize 获取数组中每个占用空间大小

3.6K100

【Python】小谈 numpy 数组占用内存空间问题

https://blog.csdn.net/u010099080/article/details/53411703 之前跟同学讨论过numpy数组占用空间大小问题,但是今天给忘了,又重新试验了一下...numpy 数组,无论什么类型,都是占用 96 个字节(byte)。...一个 int32 和一个 float32 都是占用 4 个字节,而64位都占用 8 个字节。 其他类型占用空间大小可以采用类似代码进行测试。...此外,注意 sys.getsizeof() 函数返回是 这个对象所占用空间大小,对于数组来说,除了数组中每个占用空间外,数组对象还会存储数组长度、数组类型等其他信息。...而如果只想要获取数组中存储占用空间大小,可以使用 numpy.ndarray.nbytes ,使用 numpy.ndarray.itemsize 获取数组中每个占用空间大小

1.6K20

没有什么内存问题,是一行Python代码解决不了

例如,sys.getsizeof(“ ”)返回33,没错,每个空行就多达33字节!...并且sys.getsizeof(1)将为此数字返回24-24个字节(我建议C程序员们现在点击结束阅读,以免对Python美丽失去信心)。...对于更复杂元素,例如字典,sys.getsizeof(dict())返回272个字节,这还只是一个空字典。举例到此为止,但事实已经很清楚了,何况RAM制造商也需要出售他们芯片。...在GitHub上,有一个函数可以计算实际大小,通过递归调用所有对象getsizeof实现。...get_size([d1])函数返回532个字节,显然,这些是“原本”460+一些额外开销。但是get_size([d1,d2])返回863个字节—小于460+484。

54210

没有什么内存问题,是一行Python代码解决不了

例如,sys.getsizeof(“ ”)返回33,没错,每个空行就多达33字节!...并且sys.getsizeof(1)将为此数字返回24-24个字节(我建议C程序员们现在点击结束阅读,以免对Python美丽失去信心)。...对于更复杂元素,例如字典,sys.getsizeof(dict())返回272个字节,这还只是一个空字典。举例到此为止,但事实已经很清楚了,何况RAM制造商也需要出售他们芯片。...在GitHub上,有一个函数可以计算实际大小,通过递归调用所有对象getsizeof实现。...get_size([d1])函数返回532个字节,显然,这些是“原本”460+一些额外开销。但是get_size([d1,d2])返回863个字节—小于460+484。

58910

Python基本数据类型

9223372036854775808 -9223372036854775808 >>> -9223372036854775809 -9223372036854775809L 长整型 long,长整型包含最大数字大小由内存决定...这看上去相当完美,然而,实际精度依赖于机器架构和创建Python解释器编译器。 浮点型通常都有一个小数点和一个可选后缀e(大写或小写,表示科学计数法)。...经过Python实测浮点型默认长度是24字节如果超出这个范围会自动 以下时Python3.6测试过程: >>> import sys >>> a = 1.1 >>> sys.getsizeof(a) 24...映射类型对象里哈希(键,key) 和指向对象 (。value) 是一对关系。一个字典对象是可变,它是一个容器类型,能存储任意个数 Python对象,其中也包括其他容器类型。...你可以用键直接“映射”到,这就是为什么叫映射类型(“mapping type”) 原因。映射类型通常被称做哈希表,是因为字典对象就是哈希类型。字典是 Python中最强大数据类型之一。

72420

Python 进阶指南(编程轻松进阶):八、常见 Python 陷阱

---- 引用、内存使用和sys.getsizeof() 这看起来像是创建一个新列表而不是修改原来列表浪费内存。但是请记住,就像变量在技术上包含对引用而不是实际一样,列表也包含对引用。...您可以通过使用sys.getsizeof ()函数看到这一点,该函数返回传递给它对象在内存中占用字节数。...,而字符串中每个实际字符占用 1 个字节。)...一个引用大小只有几个字节,但是想象一下如果 Python 复制了整个列表而不仅仅是引用。...要将括号识别为一个元组 2 ,需要使用尾随逗号。在 Python 中,逗号构成元组括号。 总结 每种语言都会出现沟通错误,甚至在编程语言中也是如此。Python 有几个陷阱会让粗心的人上当。

1.5K50

提高代码效率6个Python内存优化技巧

但是其实有许多方法可以显著优化Python程序内存使用,这些方法可能在实际应用中并没有人注意,所以本文将重点介绍Python内置机制,掌握它们将大大提高Python编程技能。...首先在进行内存优化之前,我们首先要查看内存使用情况 分配了多少内存? 有几种方法可以在Python中获取对象大小。...可以使用sys.getsizeof()来获取对象的确切大小,使用objgraph.show_refs()来可视化对象结构,或者使用psutil.Process().memory_info()。...# 80 print(sys.getsizeof(my_list)) # 120 元组my_tuple列表使用更少内存,如果创建后不需要更改数据,我们应该选择元组而不是列表。...这在Python中被称作字符串驻留(string interning).如果有几个相同小字符串,它们将被Python隐式地存储并在内存中并引用相同对象。定义小字符串阈值数字是4096。

19010

Python 存储字符串时,是如何节省空间

可是,当碰到大量字符处理时候,这些细节就要特别注意了。 我们可以做一些小实验来体会下上面三种方式差别。方法 sys.getsizeof 用来获取一个对象所占用字节,这里我们会用到。...- sys.getsizeof(string3) 4 >>> sys.getsizeof(string3) 80 如上所示,当字符串内容不同时,所采用编码也会不同。...需要注意是,Python 中每个字符串都会另外占用 49-80 字节空间,用于存储额外一些信息,比如哈希、字符串长度、字符串字节数和字符串标识。...因为这些语言文字码位(编码)超过了 1 个字节范围(0-255)。 >>> ord('a') 97 >>> ord('你') 20320 >>> ord('!')...Python 内部为什么不直接使用 UTF-8 编码 最常见 Unicode 编码是 UTF-8,但是 Python 内部并没有使用它。

2.5K60

如何降低 Python 内存消耗量?

但是,让我们看看dict在内容中占用空间大小: >>> print(sys.getsizeof(ob)) 240 如上所示,dict占用了大量内存,尤其是如果突然虚需要创建大量实例时: 实例数 对象大小...(weak reference);字段__dict__是该类实例字典引用,其中包含实例属性(注意在64-bit引用平台中占用8字节)。...从Python3.3开始,所有类实例字典键都存储在共享空间中。这样就减少了内存中实例大小: >>> print(sys.getsizeof(ob), sys.getsizeof(ob....(ob)) 72 由于内存中元组还包含字段数,因此需要占据内存8个字节,多于带有__slots__类: 字段 大小字节) PyGC_Head 24 PyObject_HEAD 16 ob_size...: >>> ob = Point(1,2,3) >>> print(sys.getsizeof(ob)) 32 内存结构如下: 字段 大小字节) PyObject_HEAD 16 x 4 y 4

1.5K20

解密 Python 中对象模型

为什么要这么做? 因为在 Python 中一个对象一旦被创建,那么它在内存中大小就不可以变了。所以这就意味着那些可以容纳可变长度数据可变对象,要在内部维护一个指向可变大小内存区域指针。...但为什么要这么设计呢? 这么做原因就在于,遵循这样规则可以使通过指针维护对象工作变得非常简单。一旦允许对象大小可在运行期改变,那么我们就可以考虑如下场景。...而浮点数大小是不变,因为Python浮点数在C中是通过一个double来维护。而C中类型一旦确定,大小就不变了,所以Pythonfloat也是不变。...import sys print(sys.getsizeof("a")) # 50 print(sys.getsizeof("abc")) # 52 我们看到多了两个字符,多了两个字节,这很好理解...import sys print(sys.getsizeof("")) # 49 显然是的,显然这 49 个字节是用来维护其它成员信息,因为底层结构体除了维护具体之外,还要维护其它信息,

1.5K20

你写 Python 代码可以更“瘦”

称之为到该对象弱引用(weak reference);字段 __dict__ 是该类实例字典引用,其中包含实例属性(注意在 64-bit 引用平台中占用 8 字节)。...从 Python 3.3 开始,所有类实例字典键都存储在共享空间中。这样就减少了内存中实例大小: >>> print(sys.getsizeof(ob), sys.getsizeof(ob....(ob)) 72 由于内存中元组还包含字段数,因此需要占据内存 8 个字节,多于带有 __slots__ 类: 字段 大小字节) PyGC_Head 24 PyObject_HEAD 16 ob_size...内存中实例结构与带有 __slots__ 类相同,但没有 PyGC_Head: 字段 大小字节) PyObject_HEAD 16 ob_size 8 x 8 y 8 z 8 总计: 48 >>...: >>> ob = Point(1,2,3) >>> print(sys.getsizeof(ob)) 32 内存结构如下: 字段 大小字节) PyObject_HEAD 16 x 4 y 4

63430

你写 Python 代码也需要减肥!

称之为到该对象弱引用(weak reference);字段 __dict__ 是该类实例字典引用,其中包含实例属性(注意在 64-bit 引用平台中占用 8 字节)。...从 Python 3.3 开始,所有类实例字典键都存储在共享空间中。这样就减少了内存中实例大小: >>> print(sys.getsizeof(ob), sys.getsizeof(ob....(ob)) 72 由于内存中元组还包含字段数,因此需要占据内存 8 个字节,多于带有 __slots__ 类: 字段 大小字节) PyGC_Head 24 PyObject_HEAD 16 ob_size...内存中实例结构与带有 __slots__ 类相同,但没有 PyGC_Head: 字段 大小字节) PyObject_HEAD 16 ob_size 8 x 8 y 8 z 8 总计: 48 >>...: >>> ob = Point(1,2,3) >>> print(sys.getsizeof(ob)) 32 内存结构如下: 字段 大小字节) PyObject_HEAD 16 x 4 y 4 z

77230

Python字典与散列表

但是,在实际操作总,由于解释器会为处理所有这些复杂问题,我们不用去关心,给我们感觉就是“删除”了那个指定键值对。 探寻所以然 字典是散列表,那么它在后台是如何运行?...>>> my_dict["a"] = 100 >>> sys.getsizeof(my_dict) 240 这是为什么呢?...因为从Python 3.6开始,字典中值存储在不同数据结构中,而字典仅包含指向实际存储位置指针。...此外,当创建一个空字典时,它同时创建一个Python散列表,其中包含8个存储容器,长度只有240个字节,因此字典中增加了第一个元素后,根本没有改变其大小。...del my_dict[key] ... >>> my_dict {} >>> sys.getsizeof(my_dict) 648 与没有删除前比较,发现居然大小没变。

4.7K10

用Python实现数据结构之栈

原则就是后进先出(LIFO),栈被使用于非常地方,例如浏览器中后退按钮,文本编辑器中撤销机制,接下来我们用Python来具体实现这个数据结构。...data = [] for _ in range(30): a = len(data) b = sys.getsizeof(data) print('长度:{0:3d}; 占用字节...; 占用字节: 264 长度: 26; 占用字节: 344 长度: 27; 占用字节: 344 长度: 28; 占用字节: 344 长度: 29; 占用字节: 344 通过观察data列表占用字节大小增长规律...这是由于list在底层还是基于数组实现,它每次都会先申请一个长度,当占用字节要超过最大范围时,再将数组大小增加。...很明显,当不得不在底层增加数组长度时候,这时消耗必然只添加数据时要大,所以在某些情况下,我们实现,可以增加一个设置固定长度,提前将所有位置初始化为None,那么在程序运行时,就会减少了再增大底层数组时开销

34020

Python技巧 | 一行代码减少一半内存占用

Python是一种具有动态类型非常灵活语言,对于它工作,它存储了大量附加数据。它们本身占据了很多。 例如,sys.getsizeof("")返回33bytes,是的一个多达33个字节空行!...并且sys.getsizeof(1)返回24bytes,一个整个数字占用24个bytes(我想咨询C语言程序员,远离屏幕,不想在进一步阅读,以免对美观失去信心)。...对于更复杂元素,如字典,sys.getsizeof(.())返回272字节,这是针对空字典,我不会再继续了,我希望原理是明确,并且RAM制造商需要出售他们芯片。...下边有一个函数可以通过递归方式,调用getsizeof函数,计算对象实际数据量。...使用__dict__节省空间非常大”。 我们确认:是的,确实很重要,get_size (d1)返回…64字节,而不是460字节,即少7倍。

4.7K32
领券