Python3--数据类和字典,哪一个访问数据更快?

Python 3 - Which one is faster for accessing data: dataclasses or dictionaries?(Python3--数据类和字典,哪一个访问数据更快?)
本文介绍了Python3--数据类和字典,哪一个访问数据更快?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Python3.7引入了dataclasses来存储数据。我正在考虑采用这种比词典更有条理、结构更好的新方法。

但我有一个疑问。Python将键转换为DICT上的散列,这使得查找键和值的速度更快。数据类实现了类似的东西吗?

哪个更快?为什么?

推荐答案

Python中的所有类实际上都在幕后使用字典来存储它们的属性,您可以在文档中阅读here。要更深入地了解Python类(以及更多内容)是如何工作的,您还可以查看python's datamodel上的文章,特别是关于定制类的部分。

因此,通常情况下,从字典转移到数据类不会降低性能。但最好确保使用timeit模块:


基线

# dictionary creation
$ python -m timeit "{'var': 1}"
5000000 loops, best of 5: 52.9 nsec per loop

# dictionary key access
$ python -m timeit -s "d = {'var': 1}" "d['var']"
10000000 loops, best of 5: 20.3 nsec per loop

基本数据类

# dataclass creation
$ python -m timeit -s "from dataclasses import dataclass" -s "@dataclass" -s "class A: var: int" "A(1)" 
1000000 loops, best of 5: 288 nsec per loop

# dataclass attribute access
$ python -m timeit -s "from dataclasses import dataclass" -s "@dataclass" -s "class A: var: int" -s "a = A(1)" "a.var" 
10000000 loops, best of 5: 25.3 nsec per loop

在这里我们可以看到,使用类确实有一些开销。对于类创建来说,这相当慢(大约慢5倍),但只要您不打算每秒多次创建和丢弃数据类,您就不必太在意它。

属性访问可能是更重要的指标,虽然数据类再次变慢(~1.25倍),但这次没有那么慢。

如果您认为这仍然有点太慢,您可以使用slots而不是字典来存储它们的属性,从而调优您的数据类(或者实际上是任何类):


时隙数据类

# dataclass creation
$ python -m timeit -s "from dataclasses import dataclass" -s "@dataclass" -s "class A: __slots__ = ('var',); var: int" "A(1)" 
1000000 loops, best of 5: 242 nsec per loop

# dataclass attribute access
$ python -m timeit -s "from dataclasses import dataclass" -s "@dataclass" -s "class A: __slots__ = ('var',); var: int" -s "a = A(1)" "a.var"
10000000 loops, best of 5: 21.7 nsec per loop

通过使用这种模式,我们可以多刮几纳秒。在这一点上,至少在属性访问方面,应该不再与字典有明显的区别,并且您可以在不影响速度的情况下使用数据类的优点。

这篇关于Python3--数据类和字典,哪一个访问数据更快?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)