К обсуждениям

Python 3.14.7: XPath с [last()] не должен квадратично обходить одинаковые XML-узлы

Редакция VOne Технологии

Python 3.14.7: XPath с [last()] не должен квадратично обходить одинаковые XML-узлы. Безопасный test/control, измеримая матрица, дерево решения, stop-line и минимальный пакет поддержки.

Симптом и точная граница

Эта страница отвечает только на запрос «как проверить производительность ElementTree findall с XPath [1] [last()] и [last()-N] в Python 3.14.7». Подтверждённое изменение Python 3.14.7: ElementTree избегает квадратичного поведения index predicates на XML с множеством одноимённых siblings. Пользовательский симптом отделён от гипотезы: поиск последнего узла резко замедляется при удвоении числа одинаковых элементов. Один похожий traceback, таймаут или рост ресурса не доказывает эту причину. До эксперимента сохраните версию интерпретатора, платформу, ожидаемый переход и deadline. Не обновляйте рабочее окружение ради проверки: сначала нужен воспроизводимый локальный A/B.

Изолированный сценарий

Сценарий T19-02: ElementTree строит публичный XML с 2k, 4k и 8k item и выполняет три index predicate отдельно. Дерево создавайте до начала таймера, иначе стоимость парсинга смешается с XPath. Для [last()-N] закрепите N и ожидаемый индекс заранее. Отдельная строка матрицы нужна для каждого predicate: объединённый цикл не покажет, какая форма выражения создаёт лишнюю работу. Используются только синтетические markers, loopback, in-memory объекты или временный каталог. Все размеры, очереди и повторы ограничены заранее. Если требуемый runtime component отсутствует, результатом считается environment blocker, а не отрицание исправления.

Контрольная ветка

Независимый control: поиск по уникальному id на тех же трёх деревьях. Test и control запускаются в новых процессах или на новых объектах с одной версией Python, одинаковой архитектурой и одинаковым порядком измерений. Сначала снимите A, затем проблемную ветку B, выполните полный cleanup и повторите A2. Если A2 отличается от A, состояние протекло между опытами; дальнейшая интерпретация блокируется до устранения handle, cache, task, file descriptor или временного файла.

Матрица наблюдений

Заполняйте таблицу «predicate × sibling count × result id × elapsed median × ratio». Сохраняйте состояния и типы, а не впечатления: exception class отдельно от message, promise/task state отдельно от результата, bytes length отдельно от содержимого, elapsed отдельно от deadline. Для процесса фиксируйте exit code и signal; для потоков — порядок событий; для parser — ожидаемый и фактический индекс. Один пустой столбец означает, что case не завершён. Реальные payload, адреса, токены, абсолютные пути и полные dumps в таблицу не входят.

Дерево решения

Основная ветка: каждый predicate возвращает ожидаемый id без квадратичного скачка относительно control — исправление подтверждено. Если test и control одинаково не проходят, исправьте fixture. Если control чист, а test не воспроизводится, статус остаётся unknown: нельзя придумывать причину или популярность. Если test воспроизводится на старом interpreter, но не на 3.14.7 при одинаковом окружении, зафиксируйте узкую compatibility boundary, а не универсальную рекомендацию обновиться. Любое расхождение повторов требует ещё одного полного A/B, а не выборочного удаления неудобной строки.

Красные флаги и остановка

Предметная stop-line: не загружать рабочий XML и не интерпретировать microbenchmark как общую скорость ElementTree. Также немедленно остановитесь при внешнем соединении, записи за temp root, зависании без управляемого child, неожиданном повышении прав, появлении приватных данных или изменении рабочей базы. Нельзя получать зелёный исход отключением проверки сертификатов, бесконечным retry, безразмерным input, глобальным подавлением exception или уничтожением состояния. Безопасный нулевой вывод предпочтительнее правдоподобной выдумки.

Минимальный пакет поддержки

Передайте только: predicate, counts, expected/actual id, timings, Python version. Добавьте московский timestamp, точный `python --version`, платформу, один обезличенный command и строки A/B/A2. Уберите PIDs, usernames, внутренние hostnames, email, IP, содержимое архивов и баз, environment variables, полные пути и memory dumps. Получатель должен суметь повторить один state transition без доступа к вашей инфраструктуре. Если для воспроизведения требуется production-файл, пакет ещё не минимизирован.

Почему ответ T19-02 самостоятельный

Уникальность определяется не названием Python, а связкой intent «как проверить производительность ElementTree findall с XPath [1] [last()] и [last()-N] в Python 3.14.7», symptom «поиск последнего узла резко замедляется при удвоении числа одинаковых элементов», boundary «ElementTree избегает квадратичного поведения index predicates на XML с множеством одноимённых siblings», fixture «ElementTree строит публичный XML с 2k, 4k и 8k item и выполняет три index predicate отдельно», matrix «predicate × sibling count × result id × elapsed median × ratio» и control «поиск по уникальному id на тех же трёх деревьях». Применимое решение ограничено правилом «каждый predicate возвращает ожидаемый id без квадратичного скачка относительно control — исправление подтверждено» и stop-line «не загружать рабочий XML и не интерпретировать microbenchmark как общую скорость ElementTree». Соседнее исправление parser, asyncio, tarfile, logging, SQLite или process pool имеет другой объект, failure mode и дерево решения. После теста удалите временные artifacts и подтвердите отсутствие активных tasks, threads, listeners, sockets и child processes. Идентификатор: python3147-elementtree-xpath-index-siblings.

Материал подготовлен редакцией VOne с помощью ИИ по открытым официальным и первичным источникам; факты, даты и ссылки перепроверены. Реальные пользовательские данные не использовались.

Источники и проверка

Информация актуальна на дату публикации. Правила сервисов, приложений и сетей могут меняться.

Ответы

0 опубликовано
Ответов пока нет. Вы можете начать обсуждение.

Ваш ответ

Добавьте свой опыт или уточнение по теме.

Вы публикуете как Аноним Аватар отличает разговоры, но не раскрывает личные данные.

Ответ появится сразу. Не публикуйте личные данные, ключи и приватные ссылки.