cuốn sách gpt4 ai đã làm

Python 3 - Truy cập dữ liệu nào nhanh hơn: lớp dữ liệu hoặc từ điển?

In lại Tác giả: Walker 123 更新时间:2023-11-28 21:33:00 hai mươi bốn 4
mua khóa gpt4 Nike

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

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

哪个更快,为什么?

câu trả lời hay nhất

python 中的所有类实际上都使用一个字典来存储它们的属性,你可以阅读 đây在文档中。有关 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/

hai mươi bốn 4 0
Walker 123
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress