Planet Python на русском
Подписаться
Боб Белдербос: Как библиотеки запускают Rust внутри Python (с PyO3)
Валидация данных в Pydantic v2 основана на расширении Rust под названием pydantic-core, созданном с использованием PyO3. В этом посте демонстрируется, как создать пользовательский JSON-парсер в Rust и вывести его на Python. Процесс включает написание Rust-модуля, аннотирование его макросами PyO3 и использование Maturin для компиляции и установки. Ядро примера — это Rust-энум, представляющий структуру JSON-дерева. Открытие функции в Python требует специфических аннотаций и типов PyO3, таких как Python и Bound. Самым значимым аспектом является преобразование структур данных Rust обратно в объекты Python. Этот «возврат» включает создание множества объектов Python, что может быть дороже, чем сам парсинг для крупных JSON-документов. Это преобразование осуществляется с использованием черты IntoPyObject. Также необходимо переводить ошибки; Ошибки Rust преобразуются в исключения Python с помощью признака From. Для скалярных значений возврата стоимость перехода границы незначительна. Однако для крупных структур стоимость конвертации существенна и может доминировать в производительности. Оптимизация преобразования границ, потенциально за счёт возвращения ленивых видов, крайне важна для успешных портов Rust-to-Python. Поэтому профилирование границы между Rust и Python является необходимым.