Сначала найдите участок, на который тратится время
Профилировщик помогает увидеть время работы функций и число вызовов. В стандартной библиотеке для такого анализа доступен cProfile. Его показания позволяют выбрать место для исследования, но само профилирование добавляет накладные расходы. Для сравнения небольших вариантов кода удобен отдельный замер, например с timeit. Предположим, основное время уходит на многократную проверку принадлежности длинному списку. Тогда есть обоснованная гипотеза: заменить структуру для поиска. Если же программа в основном ждёт сеть, подобная замена может почти не изменить длительность всей задачи. Условный расчёт помогает оценить предел: если нужный фрагмент занимает две секунды из десяти, даже полное устранение этих двух секунд оставит восемь. Такой расчёт не требует обещать результат до измерения.
Измените структуру поиска, сохранив смысл
Проверка наличия элемента в списке может последовательно просматривать множество значений. Для множества поиск в среднем имеет постоянную временную сложность, хотя существуют худшие случаи. Поэтому при многочисленных проверках строковые разрешённые идентификаторы часто удобно заранее собрать в set. Но множество требует создания и дополнительной памяти. Если разрешённых значений мало, а проверка выполняется один раз, выигрыш не гарантирован. Если набор разрешений меняется, нужно также определить, когда обновлять подготовленную структуру. Сохраняйте исходную последовательность запросов и проверяйте каждый её элемент по множеству разрешений. Не заменяйте результат пересечением двух множеств без анализа требований: это может убрать повторы и изменить порядок. Например, вход «А, Б, А» при разрешённом «А» должен дать «А, А», если задача требует сохранить повторные появления.
Измеряйте одинаковую работу
До сравнения времени убедитесь, что оба варианта возвращают одинаковый результат. Проверьте пустой вход, повторяющиеся значения, полное отсутствие совпадений и случай, когда разрешено всё. Затем используйте одни и те же данные и окружение для замеров. Важно явно определить границы измерения. Если множество создаётся для каждого запуска задачи, включите его построение во время оптимизированного варианта. Если оно действительно используется многократно, можно отдельно измерить подготовку и последующие обращения. Исключение обязательной работы из замера создаст искусственный выигрыш. Повторите измерения и посмотрите на разброс. Запишите версию Python, размеры наборов и способ подготовки данных. После локального ускорения снова измерьте полную задачу: именно её длительность показывает практический эффект. Не переносите коэффициент ускорения на другие объёмы без новой проверки.
Попробуйте на практике
Проведите небольшой эксперимент в уже доступной среде Python.
- Создайте две функции фильтрации строковых идентификаторов: одна проверяет принадлежность списку, другая — заранее построенному множеству, сохраняя порядок входа.
- Сравните результаты на пустом входе, повторах и несовпадающих значениях. Исправьте различия до измерений.
- Подготовьте небольшой и более крупный набор данных. Для каждого сравнения используйте одинаковый вход.
- Измерьте оба варианта несколько раз через timeit. Отдельно учтите создание множества согласно выбранному сценарию использования.
- Запишите полученные времена, условия и вывод: где изменение помогает, а где его стоимость может перевешивать пользу.
Как проверить результат. Эксперимент завершён, если результаты функций совпадают, границы измерения описаны и вывод относится только к проверенным условиям. Ускорение без сохранения порядка или повторов не считается успешным, когда они нужны задаче.
Частые вопросы
Нужно ли оптимизировать каждую функцию?
Сначала измерьте полный сценарий и найдите существенные затраты. Изменение редко вызываемой быстрой функции может усложнить код без заметной пользы.
Достаточно ли одного удачного замера?
Нет. Фоновая нагрузка и особенности запуска влияют на результат. Повторные измерения и одинаковые условия помогают отличить устойчивое изменение от случайного колебания.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.