Просто добавьте элементы в словарь, не проверяя их существование. Я добавил 100 000 предметов в словарь, используя 3 разных метода, и приурочил его к модулю timeit.
if k not in d: d[k] = v
d.setdefault(k, v)
d[k] = v
Вариант 3 был самым быстрым, но не намного.
[На самом деле, я также пробовал if k not in d.keys(): d[k] = v
, но это было медленнее в 300 раз (каждая итерация построила список ключей и выполнила линейный поиск). Это сделало мои тесты настолько медленными, что я оставил их здесь.]
Вот мой код:
import timeit
setup = """
import random
random.seed(0)
item_count = 100000
# divide key range by 5 to ensure lots of duplicates
items = [(random.randint(0, item_count/5), 0) for i in xrange(item_count)]
"""
in_dict = """
d = {}
for k, v in items:
if k not in d:
d[k] = v
"""
set_default = """
d = {}
for k, v in items:
d.setdefault(k, v)
"""
straight_add = """
d = {}
for k, v in items:
d[k] = v
"""
print 'in_dict ', timeit.Timer(in_dict, setup).timeit(1000)
print 'set_default ', timeit.Timer(set_default, setup).timeit(1000)
print 'straight_add ', timeit.Timer(straight_add, setup).timeit(1000)
И результаты:
in_dict 13.090878085
set_default 21.1309413091
straight_add 11.4781760635
Примечание: Это все довольно бессмысленно. Мы ежедневно получаем много вопросов о том, какой самый быстрый способ выполнить x или y в Python. В большинстве случаев ясно, что вопрос задавался до того, как возникли проблемы с производительностью. Мой совет? Сосредоточьтесь на написании самой четкой программы, которую вы можете написать, и если она слишком медленная, профилируйте ее и оптимизируйте там, где это необходимо. По моему опыту, я почти никогда не занимаюсь профилем и оптимизацией шага. Из описания проблемы кажется, что хранилище словарей не будет основной бутылочной горловиной в вашей программе.
Как вы можете даже иметь эту проблему? Обычно вы должны знать, какие ключи вы задали раньше, или просто построить окончательный dict за один раз. –
Я вычисляю все элементы (и отношения) в алгебре. И я должен использовать то, что знаю, чтобы узнать те, которые я не знаю. Некоторые вычисления сложнее, поэтому я сохраняю их для последнего. Надеясь, что к тому моменту, когда я приступлю к их вычислению, я могу использовать других, чтобы получить их бесплатно. Поэтому скоро я не знаю, какие отношения я уже обнаружил, а чего нет. Поскольку элементов много, и отношений тоже, мне нужно быть быстрыми. –
Из описания проблемы кажется, что хранение словаря не будет главной бутылочной горловиной в вашей программе. Просто напишите самую четкую программу, которую вы можете написать, и если она слишком медленная, профилируйте ее и оптимизируйте там, где это необходимо. По моему опыту, я почти никогда не занимаюсь профилем и оптимизацией шага. –