这取决于您的需求。他们每个人都有自己的利益。
这是对PyCon 2018 Raymond
Hettinger上的数据类的很好的解释-数据类:结束所有代码生成器的代码生成器
在 Dataclass
所有实现中
NamedTuple,都是使用 Python编写的
,而在in中,所有这些行为都是免费的,因为它们是
NamedTuple从继承的
tuple。并且由于
tuple
结构是用C编写的,因此标准方法的速度更快
NamedTuple(哈希,比较等)。
另请注意, Dataclass
基于,dict
而 NamedTuple
基于tuple
。因此,使用这些结构具有优点和缺点。例如,使用可以减少空间使用量
NamedTuple,但是使用可以更快地访问时间
Dataclass。
请看我的实验:
In [33]: a = PageDimensionsDC(width=10, height=10)In [34]: sys.getsizeof(a) + sys.getsizeof(vars(a))Out[34]: 168In [35]: %timeit a.width43.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]: 64In [38]: %timeit a.width63.6 ns ± 1.33 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
但是随着
NamedTuple访问时间的属性数量增加,它保持不变的很小,因为它为每个属性创建一个带有该属性名称的属性。例如,对于我们来说,新类的名称空间部分将如下所示:
from operator import itemgetterclass_namespace = {... 'width': property(itemgetter(0, doc="Alias for field number 0")), 'height': property(itemgetter(0, doc="Alias for field number 1"))**}在哪些情况下namedtuple仍然是更好的选择?
当您的数据结构需要/可以 不可变,可哈希,可迭代,不可打包,可比较时,可以使用NamedTuple
。 例如, 如果您需要
更复杂的内容,则可以继承 数据结构
Dataclass。



