Эффективные способы поиска в словаре python

#python #dictionary

#python #словарь

Вопрос:

Это моя первая публикация здесь. Я новичок в программировании, и у меня есть вопрос, но я не уверен, сколько информации мне нужно включить, чтобы получить хороший совет, поэтому, если я слишком расплывчатый, пожалуйста, дайте мне знать.

Я работаю над написанием алгоритма динамического программирования для решения проблемы маршрутизации транспортных средств с временными окнами, используя подход снизу вверх. Поскольку я создаю частичные решения проблемы, я сохраняю их в словаре с ключом (tuple(jobs_served), tuple(current_vehicle_location), tuple(current_vehicle_times)) со значениями (tuple(current_cost), tuple(previous_vehicle_location), tuple(previous_vehicle_time), tuple(current_vehicle_order)) .

Прежде чем добавлять какое-либо частичное решение в мой словарь (который я называю self.memo) Я выполняю ряд тестов, чтобы исключить неосуществимые решения, доминирующие решения или пропустить любые повторяющиеся конфигурации. Чтобы выполнить некоторые или эти проверки (повторная настройка и доминирование), я просматриваю словарь, чтобы узнать, добавил ли я уже частичную конфигурацию. Я сохраняю эти частичные решения в отдельном словаре, потому что они используются рядом других функций. Я создаю словарь частичных решений с помощью:

 self.label_check = {k: v for k, v in self.memo.items() if k[0]==self.new_visited and k[1]==self.sorted_nlp}
  

И затем я ищу в этом словаре определенный ключ, используя:

 dup_label_check = {k: v for k, v in self.label_check.items() if k[0]==self.new_visited and k[1]==self.sorted_nlp and k[2]==self.sorted_nt}
  

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

Комментарии:

1. Обратите внимание, что вы можете сделать dup_label_check = {k: v for k, v in self.label_check.items() if k[:3]==[self.new_visited, self.sorted_nlp, self.sorted_nt]} вместо этого.

2. Возможно, вы могли бы сохранить отдельное dict или set из частичных решений и выполнить проверку этого? Что-то вроде (self.new_visited, self.sorted_nlp, self.sorted_nt) in self.partial_matches должно быть намного быстрее.

3. @AnnZen изменит ли это производительность поиска или это просто стилистическое изменение?

4. @Peter Я могу внести это изменение для проверки дубликатов меток, и это улучшение. Спасибо! Однако для проверки доминирования мне нужно сравнить текущее время и затраты со временем и затратами со всем, что есть в self. label_check словарь. Поэтому мне все еще нужно создать этот словарь…

5. @AnthonyKulick Это более чистый и pythonic.