Python 为什么在我的课堂上使用“吃角子老虎”并没有改变大小?

Python 为什么在我的课堂上使用“吃角子老虎”并没有改变大小?,python,python-3.x,Python,Python 3.x,我最近向一位朋友解释了\uuuuuuu插槽的用法。我想向他演示结果,并使用以下代码: 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 = Fo

我最近向一位朋友解释了
\uuuuuuu插槽的用法。我想向他演示结果,并使用以下代码:

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

为什么大小没有差别?

对于Python2,您需要从
对象继承来激活
\uuu插槽\uuuu
机器

问题是你在拿苹果和桔子做比较

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

对于
\uuuuu插槽
版本,您将看到它与插槽数量成正比

对于普通对象,您应该查看实例的大小
\uu dict\uu
,以进行合理的比较


另一种方法是分配几百万个这样的对象,看看操作系统报告使用了多少内存。

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

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

可能不是复制品,但相关: