Появился prylint — Rust-перепись pylint, который выдаёт побайтово идентичный результат, но работает в 15–2300 раз быстрее (медианный прирост — примерно 85×). Это не просто «вдохновлено» оригиналом. Это баг-за-багом порт: те же сообщения, на тех же строках и колонках, с тем же текстом, в том же порядке, с теми же exit-кодами и одинаковым «Your code has been rated» в подвале. Совпадение проверено байт-в-байт на 52 продакшн-репозиториях (~65 000 Python-файлов), включая django, numpy, pandas, sympy, home-assistant, sqlalchemy, twisted, scikit-learn и тестовый набор самого pylint. Если у pylint есть баги — prylint их воспроизводит. Если он падает — падает так же.
Установка — pip install prylint. Никаких дополнительных зависимостей, кроме python3 (≥3.9) — он нужен только чтобы копировать пути модулей и точные сообщения об ошибках синтаксиса CPython. Сам pylint и astroid не требуются.
Использовать можно так же, как pylint: prylint . — полная проверка, prylint -E . — только ошибки, работают --disable, inline pragmas, --rcfile и pyproject.toml. Всё совпадает с pylint 4.0.5.
Результаты бенчмарков на Apple M-series (однопоточный режим): black — с 26,7 часов до 41 секунды (ускорение 2328×), sentry — с 3,7 часов до 24 секунд (546×), home-assistant (17,5 тыс. файлов) — с 10,3 часов до 82 секунд (452×). Агрегат по 27 крупным репозиториям — с 45,8 часов до 4,9 минут (примерно 560×). Производительность достигается переписью на Rust, но сам движок инференса остаётся однопоточным — так воспроизводятся порядокозависимые кэши astroid.
Точность обеспечивается дифференциальным тестированием: AST-дерево (на парсере из ruff) сверяется с astroid узел за узлом, инференс портирован дословно — со всеми LRU-кэшами (lookup на 128, _metaclass_lookup_attribute на 1024), FIFO-очередью на 64 подсказки и логикой Uninferable. Слепое тестирование на 20 дополнительных репозиториях показало нуль расхождений. Известные мелкие исключения задокументированы в LIMITATIONS.md (один необычный класс в SQLAlchemy, намеренно исключённое семейство no-member, места, где pylint недетерминирован).
Лицензия — GPL-2.0-or-later, как и у pylint.