Все классы в Python фактически используют словарь для хранения своих атрибутов, как вы можете прочитать здесь в документации.Для более подробного ознакомления с тем, как работают классы Python (и многие другие), вы также можете прочитать статью о модель данных Python , в частности, раздел о пользовательских классах.
В общем, при переходе от словарей к классам данных не должно быть потери производительности.Но лучше убедиться с помощью модуля timeit :
Baseline
# 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 вместо словаря для хранения их атрибутов:
Slotted dataclass
# 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
Используя этот шаблон, мы могли бы сбрить еще несколько наносекунд.На данный момент, по крайней мере, в отношении доступа к атрибутам, больше не должно быть заметного различия со словарями, и вы можете использовать преимущества классов данных без ущерба для скорости.