如何解决Data Classes vs typing.NamedTuple 主要用例
这取决于您的需求。他们每个人都有自己的好处。
这是 PyCon 2018 Raymond Hettinger 上 Dataclasses 的一个很好的解释 - Dataclasses: The code generator to end all code generators
在 ,而在
中NamedTuple
,所有这些行为都是免费的,因为NamedTuple
继承自tuple
. 而且由于 ,标准方法在NamedTuple
(散列、比较等)方面更快。
另请注意, 而 。因此,您有使用这些结构的优点和缺点。例如,使用 的空间使用较少NamedTuple
,但使用
的时间访问更快Dataclass
。
请看我的实验:
In [33]: a = PageDimensionsDC(width=10, height=10)
In [34]: sys.getsizeof(a) + sys.getsizeof(vars(a))
Out[34]: 168
In [35]: %timeit a.width
43.2 ns 卤 1.05 ns per loop (mean 卤 std. dev. of 7 runs, 10000000 loops each)
In [36]: a = PageDimensionsNT(width=10, height=10)
In [37]: sys.getsizeof(a)
Out[37]: 64
In [38]: %timeit a.width
63.6 ns 卤 1.33 ns per loop (mean 卤 std. dev. of 7 runs, 10000000 loops each)
但是随着属性数量的增加NamedTuple
访问时间仍然很小,因为它为每个属性创建了一个具有属性名称的属性。例如,对于我们的例子,新类的命名空间部分如下所示:
from operator import itemgetter
class_namespace = {
...
'width': property(itemgetter(0, doc="Alias for field number 0")),
'height': property(itemgetter(0, doc="Alias for field number 1"))**
}
在哪些情况下,namedtuple 仍然是更好的选择?
当您的数据结构需要/可以是 . 如果您需要 您的数据结构的继承可能性,请使用Dataclass
.
解决方法
长话短说
PEP-557将数据类引入 Python
标准库,基本上可以扮演collections.namedtuple
和typing.NamedTuple
. 现在我想知道如何分离 namedtuple
仍然是更好的解决方案的用例。
数据类优于 NamedTuple
当然,dataclass
如果我们需要,所有功劳都归于:
- 可变对象
- 继承支持
property
装饰器,可管理的属性- 开箱即用的生成方法定义或可自定义的方法定义
数据类的优势在同一个 PEP 中进行了简要说明:Why not just use
namedtuple。
问:在哪些情况下,namedtuple 仍然是更好的选择?
但是对于 namedtuples 有一个相反的问题:为什么不直接使用数据类呢?我猜从性能的角度来看,namedtuple 可能更好,但还没有发现任何确认。
例子
让我们考虑以下情况:
我们将把页面维度存储在一个带有静态定义字段、类型提示和命名访问的小容器中。不需要进一步的散列、比较等。
NamedTuple 方法:
from typing import NamedTuple
PageDimensions = NamedTuple("PageDimensions",[('width',int),('height',int)])
数据类方法:
from dataclasses import dataclass
@dataclass
class PageDimensions:
width: int
height: int
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。