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
可能不是复制品,但相关: