2024-06-16 10:06:02 发布
网友
Python的__slots__用于减少实例的内存占用,这是通过将变量存储在“小的固定大小的数组中,就像元组或列表”来实现的。实例属性是可变的,但不能添加其他属性。你知道吗
__slots__
另一方面,有一些数据类(根据我收集的信息)通过定义一些dunders(etc)来帮助创建类,并且在pep557中被描述为“具有默认值的可变namedtuples”。你知道吗
我理解他们的目的是不同的,事实上你可以use both of them。你知道吗
dataclass修饰符不影响属性的存储或检索方式。内存消耗和属性访问时间的行为与编写类时不使用dataclass完全相同。你知道吗
dataclass
与不使用__slots__的类似类相比,使用__slots__的类将具有更少的内存消耗和稍微更快的属性访问(因为插槽描述符节省了一些dict查找),而不管其中任何一个类是否使用dataclass。下面是一个计时示例,说明dataclass不会影响属性查找时间,而__slots__会影响:
>>> import timeit >>> import dataclasses >>> @dataclasses.dataclass ... class Foo: ... a: int ... b: int ... >>> class Bar: ... def __init__(self, a, b): ... self.a = a ... self.b = b ... >>> foo = Foo(1, 2) >>> bar = Bar(1, 2) >>> timeit.timeit('foo.a', globals=globals()) 0.08070236118510365 >>> timeit.timeit('bar.a', globals=globals()) 0.07813134230673313 >>> timeit.timeit('foo.a', globals=globals(), number=10000000) 0.5699363159947097 >>> timeit.timeit('bar.a', globals=globals(), number=10000000) 0.5526750679127872 >>> @dataclasses.dataclass ... class FooSlots: ... __slots__ = ['a', 'b'] ... a: int ... b: int ... >>> class BarSlots: ... __slots__ = ['a', 'b'] ... def __init__(self, a, b): ... self.a = a ... self.b = b ... >>> fooslots = FooSlots(1, 2) >>> barslots = BarSlots(1, 2) >>> timeit.timeit('fooslots.a', globals=globals(), number=10000000) 0.46022069035097957 >>> timeit.timeit('barslots.a', globals=globals(), number=10000000) 0.4669580361805856
dataclass
修饰符不影响属性的存储或检索方式。内存消耗和属性访问时间的行为与编写类时不使用dataclass
完全相同。你知道吗与不使用
__slots__
的类似类相比,使用__slots__
的类将具有更少的内存消耗和稍微更快的属性访问(因为插槽描述符节省了一些dict查找),而不管其中任何一个类是否使用dataclass
。下面是一个计时示例,说明dataclass
不会影响属性查找时间,而__slots__
会影响:相关问题 更多 >
编程相关推荐