Как установить начальный размер для словаря в Python?

Это собирается потребовать чего-то, что имеет права получить доступ к аппаратному ключу. Существует также проблема взламывания его - связь не будет способной быть скрытой так, необходимо удостовериться, что это не имеет значения. Это означает, что аппаратный ключ оказывается перед необходимостью реализовывать свой собственный crpyto. Вы будете также нуждаться в поддержке для любых систем, которые Вы собираетесь поддерживать.

я вижу это получение очень сложного очень быстро.

19
задан psmears 3 August 2015 в 15:10
поделиться

6 ответов

При проблемах с производительностью всегда лучше измерить. Вот некоторые тайминги:

 d = {}
 for i in xrange(4000000):
     d[i] = None
 # 722ms

 d = dict(itertools.izip(xrange(4000000), itertools.repeat(None)))
 # 634ms

 dict.fromkeys(xrange(4000000))
 # 558ms

 s = set(xrange(4000000))
 dict.fromkeys(s)
 # Not including set construction 353ms

Последняя опция не изменяет размер, она просто копирует хэши из набора и увеличивает ссылки. Как видите, изменение размера не занимает много времени. Вероятно, создание вашего объекта происходит медленно.

31
ответ дан 30 November 2019 в 02:27
поделиться

Я пробовал:

a = dict.fromkeys((range(4000000)))

Он создает словарь с 4 000 000 записей примерно за 3 секунды. После этого установка значений происходит очень быстро. Так что я думаю, что dict.fromkey определенно лучший способ.

9
ответ дан 30 November 2019 в 02:27
поделиться

Если вы знаете C, вы можете взглянуть на dictobject.c и Заметки по оптимизации словарей . Там вы заметите параметр PyDict_MINSIZE:

PyDict_MINSIZE. В настоящее время установлено значение 8.

Этот параметр определен в dictobject.h . Таким образом, вы можете изменить его при компиляции Python, но это, вероятно, плохая идея.

7
ответ дан 30 November 2019 в 02:27
поделиться

Вы можете попробовать отделить хеширование ключей от заполнения содержимого с помощью метода класса dict.fromkeys . Он создаст дикт известного размера со всеми значениями по умолчанию либо Нет , либо значением по вашему выбору. После этого вы можете перебирать его, чтобы заполнить значениями. Это поможет вам рассчитать время фактического хеширования всех ключей. Не уверен, что вы сможете значительно увеличить скорость.

4
ответ дан 30 November 2019 в 02:27
поделиться

Если ваши данные нужны / могут быть сохранены на диске, возможно, вы можете сохранить свои данные в BSDDB база данных или используйте Cpickle для загрузки / сохранения словаря

2
ответ дан 30 November 2019 в 02:27
поделиться

Вы инициализируете все ключи новыми «пустыми» экземплярами того же типа? Разве невозможно написать defaultdict или что-то, что будет создавать объект при доступе к нему?

1
ответ дан 30 November 2019 в 02:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: