Не собирайте все совпадения: верните первый элемент из генератора через next или завершайте обычный цикл при первом успехе.
Разные подходы к ускорению функции поиска первого совпадения
Не собирайте все совпадения: верните первый элемент из генератора через next или завершайте обычный цикл при первом успехе.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Предложите несколько методов ускорения функции fetch_first_match, применяя генераторы, встроенные возможности Python и безопасные приёмы работы со значением по умолчанию.
def fetch_first_match(condition, items=None):
if items is None:
items = []
matches = [elem for elem in items if condition(elem)]
if matches:
first = matches[0]
return first
return None
fetch_first_match(lambda x: x == 1, [2, 3, 4])
Ответ
Не собирайте все совпадения: верните первый элемент из генератора через next или завершайте обычный цикл при первом успехе.
def fetch_first_match(condition, items=None):
source = () if items is None else items
return next((item for item in source if condition(item)), None)
Альтернатива — next(filter(condition, source), None) или обычный for с ранним return. Все варианты используют O(1) дополнительной памяти и прекращают проверки после первого совпадения; исходный код всегда проходил весь вход и создавал список.
Для приведённого вызова результат None. Если подходящим элементом сам может быть None, отсутствие совпадения нужно обозначать отдельным sentinel. Скорость конкретной формы следует измерять: генератор не гарантированно быстрее простого цикла.