Просто добавьте элементы в словарь, не проверяя их наличие.Я добавил 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.В большинстве случаев ясно, что вопрос задавался до того, как возникли проблемы с производительностью.Мой совет?Сосредоточьтесь на написании самой понятной программы, которую вы можете написать, и если она слишком медленная, профилируйте ее и оптимизируйте, где это необходимо.По своему опыту я почти никогда не попадаю в профиль и не оптимизирую шаг.Из описания проблемы кажется, что хранение словаря не будет основным узким местом в вашей программе.