数据类与字典

Jac*_*kie 4 python dictionary

我一直在学习数据类,并且正在修改一个旧项目,试图将数据类集成到程序中来代替我正在使用的字典系统。下面的代码块本质上是用于构建包含数千个项目的数据框的相应新方法和旧方法。我的问题是我不理解字典中数据类的用例。

我想知道的是:

  1. 我什么时候应该使用数据类而不是字典(反之亦然)?

  2. 以编程方式,在这种简单地对数据进行编目的情况下,两种方法是否比另一种更有效/更优化?

  3. 在实际实践中,是否鼓励其中一种方法优于另一种方法(出于效率、可读性、行业标准或其他原因)?

使用@dataclass的方法

@dataclass
class Car:
    year: int = None
    model: str = None

def main():
    foo = {}
    for name in car_list:
        bar = Car()
        bar.year = get_year(name)
        bar.model = get_model(name)
        
        foo[name] = vars(bar)

    df = pd.DataFrame.from_dict(foo)
Run Code Online (Sandbox Code Playgroud)

使用字典的方法

def main():
    foo = {}
    for name in car_list:

        bar = {
            'year': None
            'model': None
        }

        bar['year'] = get_year(name)
        bar['model'] = get_model(name)
        
        foo[name] = bar

    df = pd.DataFrame.from_dict(foo)
Run Code Online (Sandbox Code Playgroud)

Jac*_*kie 7

正如评论中所讨论的,关于这个特定的比较有很多讨论(和意见)。经过几个小时的研究后,我想为将来可能有此问题的其他人提出一些要点。

1、关于效率

字典是更简单的数据容器,因此效率更高。在底层,类和数据类是具有更多功能的字典。这篇 SO 帖子的最佳答案提供了有关在执行各种任务时字典比数据类效率高多少的见解。(创建容器的速度可能慢 5 倍,而访问数据的速度仅慢 1.25-1.2 倍)。网络上的其他各种帐户也显示了类似的结果。

2. 功能差异

除了速度之外的一个要点是对可变性的控制。使字典的元素不可变并非不可能,但通常需要创建类、函数或导入一些库。另一方面,数据类允许实例在创建后通过简单地传递frozen=True到数据类的装饰器中来冻结。除了明显的值更改之外,此功能还可以防止意外或以其他方式添加任何属性。

其他装饰器参数可能提供对类创建的更精细的控制。该视频是一个优秀的、适合初学者的资源,演示了数据类的多个属性和用例。

类型提示是人们更喜欢使用数据类的另一个原因。虽然类型提示可以与字典及其值一起使用,但对象的类型提示可能会带来更好的控制。这是 Medium 上一篇很棒的文章,讲述了一个团队重构了一个项目以使用数据类而不是字典的情况。

3. 哪一种适合我?

我花了大半个下午的时间来了解为什么很难找到这个问题的答案。因为这取决于。如果其中一个客观上优于另一个,另一个就会贬值。字典更简单——它们不需要导入,可以轻松创建、访问和修改,并且会更快地产生结果。另一方面,数据类允许用户更好地控制。当与多个团队成员一起处理大型项目时,这一点尤其重要。

设计程序时的一般启发是尽可能遵循最简单的结构。在我的特定情况下,当我的目标只是创建数据框并且我的输入数据有些可靠时,我不需要数据类的附加功能。使用数据类不会明显减慢我的代码速度,但如果我要接受更多输入,我可能会发现性能受到影响。