【问题标题】:Why is using __slots__ in my class not making a difference in size?为什么在我的班级中使用 __slots__ 不会改变大小?
【发布时间】:2016-09-14 11:10:56
【问题描述】:

我最近向朋友解释了__slots__ 的用法。我想向他演示结果并使用以下代码:

import sys


class Foo:
    __slots__ = 'a', 'b'

    def __init__(self, a, b):
        self.a = a
        self.b = b


class Bar:
    def __init__(self, a, b):
        self.a = a
        self.b = b


a = Foo(10, 20)
b = Bar(10, 20)

print(sys.getsizeof(a))
print(sys.getsizeof(b))

Python 3 控制台上的输出是:

 56
 56

Python 2 的输出是:

 72
 72

为什么大小没有区别?

【问题讨论】:

标签: python python-3.x


【解决方案1】:

对于 Python2,您需要从 object 继承才能激活 __slots__ 机制

问题在于您将苹果与橙子进行比较。

sys.getsizeof 只是一个浅尺寸,即。它不会计算所有内部对象的大小。

对于__slots__ 版本,您会看到它与插槽数成正比

对于普通的对象,你应该看实例__dict__的大小来做一个合理的比较。

另一种方法是分配几百万个这些对象,然后查看操作系统报告的已使用内存量。

【讨论】:

    【解决方案2】:

    John La Rooy 的观察是正确的,sys.getsizeof 很浅,因此没有给出正确的结果。使用pymplerasizeof 模块可以看到不同的答案:

    from pympler import asizeof
    
    class Foo:
        __slots__ = 'a', 'b'
    
        def __init__(self, a, b):
            self.a = a
            self.b = b
    
    
    class Bar:
        def __init__(self, a, b):
            self.a = a
            self.b = b
    
    
    x = Foo(10, 20)
    y = Bar(10, 20)
    
    print(asizeof.asizeof(x))
    print(asizeof.asizeof(y))
    

    跑步:

    python3 test.py
    

    给予:

    192
    328
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      相关资源
      最近更新 更多