Python 3 - Какой из них быстрее для доступа к данным: классы данных или словари? - PullRequest
2 голосов
/ 19 марта 2019

В Python 3.7 введены классы данных для хранения данных.Я думаю перейти к этому новому подходу, который более организован и хорошо структурирован, чем диктат.

Но у меня есть сомнения.Python преобразует ключи в хэши на словах, что значительно ускоряет поиск ключей и значений.Классы данных реализуют что-то вроде этого?

Какой из них быстрее и почему?

1 Ответ

5 голосов
/ 20 марта 2019

Все классы в 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

Используя этот шаблон, мы могли бы сбрить еще несколько наносекунд.На данный момент, по крайней мере, в отношении доступа к атрибутам, больше не должно быть заметного различия со словарями, и вы можете использовать преимущества классов данных без ущерба для скорости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...