为什么 sys.getsizeof() 为两个实例报告相同的大小,即使一个实例有一个额外的属性?

图沙尔·贾约迪亚
import sys

class MyObject:
    def __init__(self,name,salary):
        self.name = name
        self.salary = salary

obj1 = MyObject("Tushar", 50)
obj2 = MyObject("Tushar", 50)
obj2.age = 20

print(sys.getsizeof(obj1))  # 56
print(sys.getsizeof(obj2))  # 56

为什么obj2当它有一个额外的age属性时只有 56 个字节

马丁·彼得斯

sys.getsizeof()只为您提供系统内存用于直接引用。实例对象不直接存储属性,默认情况下这些属性存储在__dict__名称引用的字典对象中字典也将键和值存储为引用,sys.getsizeof()只会为您提供字典内部 C 数组和其他内部簿记属性的内存大小,而不是键或值本身。

sys.getsizeof()文档

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

您必须递归地收集对象大小,直到用完属性或键值对等。文档链接到此示例代码以向您展示如何执行此操作。

该特定配方不支持实例,但在这里传递__dict__对象属性就足够了:

>>> total_size(obj1.__dict__)
303
>>> total_size(obj2.__dict__)
383

所以这两个对象有不同的总大小属性字典。

请注意,Python缓存或实习生对象的地方很多,因此不要将这些内存大小视为绝对值。例如,小整数是 interned,所以50在 CPython 内存中只有一个整数对象,但它在上面的total_size()输出中被单独计算

并且现代 CPython 版本还可以通过让__dict__这两个实例字典对象共享键上的数据来节省内存,假设给定类的绝大多数实例将具有相同的属性。

在分析sys.getsizeof()数据时要考虑到这一点如果您想分析 Python 内存使用情况,最好先学习如何使用该tracemalloc工具

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么sys.getsizeof对于非常大的列表返回相同的输出

来自分类Dev

为什么numpy.save为sys.getsizeof 0.33MB数据生成100MB文件?

来自分类Dev

python sys getsizeof返回字符串是什么?

来自分类Dev

为什么sys.getsizeof()在Python中的file.read([size])中不返回[size]

来自分类Dev

删除一个空文件,为什么会有那么多sys调用?

来自分类Dev

使用sys.getsizeof(Var)方法的python大小的ctypes与`ctypes.sizeof(Var)`

来自分类Dev

python sys.getsizeof方法在不同版本的python上返回不同的大小

来自分类Dev

为什么有两个“Okular”实例,我如何摆脱另一个实例?

来自分类Dev

为什么没有Cdirent或sys / cstat

来自分类Dev

为什么我的代码使用两个实例而不是一个?

来自分类Dev

为什么我的系统中有两个亮度控制文件(/ sys / class /)

来自分类Dev

为什么只应有一个HTTPClient实例?

来自分类Dev

为什么Char有一个Bounded实例?

来自分类Dev

为什么Char有一个Bounded实例?

来自分类Dev

为什么不能在ruby中对一个实例两次使用相同的方法?

来自分类Dev

为什么同一类的两个实例具有不同的属性(Python)明智?

来自分类Dev

sys.getsizeof(list)返回的值小于其元素的总和

来自分类Dev

sys.getsizeof如何在后台运行?

来自分类Dev

为什么这种基于Java的Spring配置创建一个单例bean的两个实例?

来自分类Dev

为什么 Sys.time() 的 class() 长度为 2?

来自分类Dev

为什么没有/ proc / sys / kernel / softlockup_thresh

来自分类Dev

为什么/ proc和/ sys具有inode 1?

来自分类Dev

为什么performSegueWithIdentifier总是创建一个新实例?

来自分类Dev

为什么/如何部署一个顶点的多个实例

来自分类Dev

为什么需要调整第一个图像的大小以融合两个图像?

来自分类Dev

为什么两个不同实例的 isa 指针相同?

来自分类Dev

两个DateTime:一个有效,为什么另一个不起作用?

来自分类Dev

两个绑定;一个有效,另一个无效。为什么?

来自分类Dev

为什么只有一个分配时数组中的两个元素?

Related 相关文章

  1. 1

    为什么sys.getsizeof对于非常大的列表返回相同的输出

  2. 2

    为什么numpy.save为sys.getsizeof 0.33MB数据生成100MB文件?

  3. 3

    python sys getsizeof返回字符串是什么?

  4. 4

    为什么sys.getsizeof()在Python中的file.read([size])中不返回[size]

  5. 5

    删除一个空文件,为什么会有那么多sys调用?

  6. 6

    使用sys.getsizeof(Var)方法的python大小的ctypes与`ctypes.sizeof(Var)`

  7. 7

    python sys.getsizeof方法在不同版本的python上返回不同的大小

  8. 8

    为什么有两个“Okular”实例,我如何摆脱另一个实例?

  9. 9

    为什么没有Cdirent或sys / cstat

  10. 10

    为什么我的代码使用两个实例而不是一个?

  11. 11

    为什么我的系统中有两个亮度控制文件(/ sys / class /)

  12. 12

    为什么只应有一个HTTPClient实例?

  13. 13

    为什么Char有一个Bounded实例?

  14. 14

    为什么Char有一个Bounded实例?

  15. 15

    为什么不能在ruby中对一个实例两次使用相同的方法?

  16. 16

    为什么同一类的两个实例具有不同的属性(Python)明智?

  17. 17

    sys.getsizeof(list)返回的值小于其元素的总和

  18. 18

    sys.getsizeof如何在后台运行?

  19. 19

    为什么这种基于Java的Spring配置创建一个单例bean的两个实例?

  20. 20

    为什么 Sys.time() 的 class() 长度为 2?

  21. 21

    为什么没有/ proc / sys / kernel / softlockup_thresh

  22. 22

    为什么/ proc和/ sys具有inode 1?

  23. 23

    为什么performSegueWithIdentifier总是创建一个新实例?

  24. 24

    为什么/如何部署一个顶点的多个实例

  25. 25

    为什么需要调整第一个图像的大小以融合两个图像?

  26. 26

    为什么两个不同实例的 isa 指针相同?

  27. 27

    两个DateTime:一个有效,为什么另一个不起作用?

  28. 28

    两个绑定;一个有效,另一个无效。为什么?

  29. 29

    为什么只有一个分配时数组中的两个元素?

热门标签

归档