数据类与输入。NamedTuple主要用例

发布于 2021-01-29 15:09:35

长话短说

PEP-557在Python标准库中引入了数据类,该类基本上可以充当collections.namedtuple和的角色typing.NamedTuple。现在,我想知道如何将用例分隔,其中namedtuple仍然是更好的解决方案。

数据类优于NamedTuple

当然,dataclass如果需要,所有功劳都归功于:

  • 可变对象
  • 继承支持
  • property 装饰器,可管理的属性
  • 现成的方法定义或可自定义的方法定义

在同一PEP中简要说明了数据类的优点:为什么不只使用namedtuple

问:在哪些情况下,namedtuple仍然是更好的选择?

但是对于namedtuples来说,一个相反的问题呢:为什么不只使用数据类呢?从性能的角度来看,我认为namedtuple可能更好,但尚未对此进行确认。

让我们考虑以下情况:

我们将页面尺寸存储在一个具有静态定义字段,类型提示和命名访问权限的小容器中。不需要进一步的散列,比较等。

NamedTuple方法:

from typing import NamedTuple

PageDimensions = NamedTuple("PageDimensions", [('width', int), ('height', int)])

DataClass方法:

from dataclasses import dataclass

@dataclass
class PageDimensions:
    width: int
    height: int

哪种解决方案更可取,为什么?

PS问题是不是重复是一个以任何方式,因为在这里我想询问
情况 ,其中namedtuple比较好,不是 区别 (我问之前已经检查文档和源)

关注者
0
被浏览
112
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这取决于您的需求。他们每个人都有自己的利益。

    这是对PyCon 2018 Raymond
    Hettinger
    上的数据类的很好的解释-数据类:结束所有代码生成器的代码生成器

    Dataclass 所有实现NamedTuple,都是使用 Python编写的
    ,而在in中,所有这些行为都是免费的,因为它们是NamedTuple从继承的tuple。并且由于 tuple
    结构是用C编写的
    ,因此标准方法的速度更快NamedTuple(哈希,比较等)。

    另请注意, Dataclass 基于,dictNamedTuple
    基于tuple
    。因此,使用这些结构具有优点和缺点。例如,使用可以减少空间使用量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仍然是更好的选择?

    当您的数据结构需要/可以 不可变,可哈希,可迭代,不可打包,可比较时,可以使用NamedTuple例如, 如果您需要
    更复杂的内容,则可以继承 数据结构Dataclass



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看