Запускайте дешёвые подходящие парсеры раньше дорогих и останавливайтесь по явному признаку успеха, а не по истинности результата.
Эффективное управление цепочкой парсеров при больших JSON‑строках
Запускайте дешёвые подходящие парсеры раньше дорогих и останавливайтесь по явному признаку успеха, а не по истинности результата.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо предложить подход к ускорению работы цепочки парсеров, когда один из них (например, JSON‑парсер) становится узким местом из‑за размера входных данных. Парсеры вызываются последовательно, и важно прекратить дальнейшую обработку, как только какой‑то из них успешно вернёт результат.
def main_parse(data: str, parsers: List[Parser]):
for parser in parsers:
value = parser.parse(data)
if value:
return value
Опишите, как можно реорганизовать вызовы, кэшировать результаты или использовать предварительные проверки, чтобы избежать лишних дорогостоящих разборов JSON‑строки, когда более лёгкие парсеры уже нашли нужное значение.
Ответ
Запускайте дешёвые подходящие парсеры раньше дорогих и останавливайтесь по явному признаку успеха, а не по истинности результата.
if value ошибочно пропускает допустимые значения 0, False, пустую строку или список. Используйте отдельный sentinel либо результат вида (matched, value).
Перед JSON-разбором можно проверить ожидаемый первый непробельный символ и формат источника. Это лишь быстрый фильтр, не полноценная валидация. Если несколько парсеров работают с одним JSON, декодируйте его лениво один раз и передавайте общий объект. Менять порядок можно только при сохранении приоритета неоднозначных форматов. Кеш между запросами должен иметь ограниченный размер: большие строки и результаты иначе останутся в памяти. Сначала измерьте число разборов и их длительность.