#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.