Разные подходы к ускорению функции поиска первого совпадения

Не собирайте все совпадения: верните первый элемент из генератора через 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. Скорость конкретной формы следует измерять: генератор не гарантированно быстрее простого цикла.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее