首页
学习
活动
专区
工具
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)要小很多!

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

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

    98230

    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)要小很多!

    92131

    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.7K100

    【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.7K20

    没有什么内存问题,是一行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。

    55110

    没有什么内存问题,是一行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。

    61610

    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中最强大的数据类型之一。

    77520

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

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

    1.6K50

    提高代码效率的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。

    29810

    你写的 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

    64830

    你写的 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

    81330

    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.6K60

    如何降低 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.6K20

    解密 Python 中的对象模型

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

    1.6K20

    用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,那么在程序运行时,就会减少了再增大底层数组时的开销

    35620
    领券