gpt4 book ai didi

Python 3 - 访问数据哪个更快 : dataclasses or dictionaries?

转载 作者:行者123 更新时间:2023-11-28 21:33:00 24 4
gpt4 key购买 nike

Python 3.7 引入 dataclasses来存储数据。我正在考虑采用这种新方法,这种方法比字典更有条理,结构更合理。

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

哪个更快,为什么?

最佳答案

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

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

关于Python 3 - 访问数据哪个更快 : dataclasses or dictionaries?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55248416/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com