Это собирается потребовать чего-то, что имеет права получить доступ к аппаратному ключу. Существует также проблема взламывания его - связь не будет способной быть скрытой так, необходимо удостовериться, что это не имеет значения. Это означает, что аппаратный ключ оказывается перед необходимостью реализовывать свой собственный crpyto. Вы будете также нуждаться в поддержке для любых систем, которые Вы собираетесь поддерживать.
я вижу это получение очень сложного очень быстро.
При проблемах с производительностью всегда лучше измерить. Вот некоторые тайминги:
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
Последняя опция не изменяет размер, она просто копирует хэши из набора и увеличивает ссылки. Как видите, изменение размера не занимает много времени. Вероятно, создание вашего объекта происходит медленно.
Я пробовал:
a = dict.fromkeys((range(4000000)))
Он создает словарь с 4 000 000 записей примерно за 3 секунды. После этого установка значений происходит очень быстро. Так что я думаю, что dict.fromkey определенно лучший способ.
Если вы знаете C, вы можете взглянуть на dictobject.c и Заметки по оптимизации словарей . Там вы заметите параметр PyDict_MINSIZE:
PyDict_MINSIZE. В настоящее время установлено значение 8.
Этот параметр определен в dictobject.h . Таким образом, вы можете изменить его при компиляции Python, но это, вероятно, плохая идея.
Вы можете попробовать отделить хеширование ключей от заполнения содержимого с помощью метода класса dict.fromkeys
. Он создаст дикт
известного размера со всеми значениями по умолчанию либо Нет
, либо значением по вашему выбору. После этого вы можете перебирать его, чтобы заполнить значениями. Это поможет вам рассчитать время фактического хеширования всех ключей. Не уверен, что вы сможете значительно увеличить скорость.
Если ваши данные нужны / могут быть сохранены на диске, возможно, вы можете сохранить свои данные в BSDDB база данных или используйте Cpickle для загрузки / сохранения словаря
Вы инициализируете все ключи новыми «пустыми» экземплярами того же типа? Разве невозможно написать defaultdict или что-то, что будет создавать объект при доступе к нему?