← На главную

Buf анонсировала protobuf-py — быстрее Google с Rust-акселератором

08.07.2026 03:16 · hackernews

Компания Buf анонсировала protobuf-py — библиотеку Protocol Buffers для Python, написанную с нуля. Она проходит все тесты Protobuf conformance suite на бинарном и JSON форматах для proto2, proto3 и editions. Поддерживает extensions, custom options, unknown fields, dynamic messages и well-known types. Генерирует читаемый, типизированный Python и не имеет зависимостей. С опциональным Rust-акселератором она не уступает по скорости upb — C-движку, на котором работает Google-пакет.

Проблема в том, что раньше разработчики выбирали между полной реализацией Protobuf и библиотекой, которая ощущается как Python. Google-пакет полный, но его API сформирован под C++ и Java. Betterproto приятен, но жертвует значительной частью спецификации. protobuf-py, по задумке авторов, даёт и то, и другое.

Google-пакет из PyPI использует движок upb на C. Сообщение хранится в C-арене, а Python-объект — лишь указатель на неё. Чтение каждого поля требует перехода в C и материализации Python-объекта. Это эффективно для мультиязычного движка, но оставляет следы: сгенерированные _pb2.py файлы нечитаемы, методы вроде HasField или WhichOneof скопированы из C++ эргономики, импорты абсолютные и ломаются при вложенности, типы регистрируются в общем пуле процессов.

protobuf-py держит сообщение в Python. Это обычный объект с slots, а поля — int, str, list и вложенные сообщения. Rust-акселератор ускоряет парсинг и сериализацию, записывая результат сразу в объект. После парсинга чтение поля — это просто обращение к атрибуту. Сгенерированный код — реальный класс, который можно открыть и прочитать.

Oneof теперь поддаются pattern matching, и тайпчекер сужает ветки. Enum — настоящие IntEnum. pyright, mypy и ty понимают сгенерированный код без заглушек. Файлы используют относительные импорты. Типы разрешаются через explicit Registry, а не глобальный пул.

Библиотека покрывает всю спецификацию: proto2, proto3, editions, extensions, custom options, groups, unknown-field preservation, packed/expanded repeated fields и ProtoJSON для well-known types. Тестов нет.

Бенчмарк на реальном сценарии — сборка ответа для домашней страницы соцсети — показывает, что protobuf-py в end-to-end тесте обгоняет upb (1.06x против 1.0x), хотя в изоляции проигрывает на парсинге (0.22x) и сериализации (0.60x). Разница в том, что upb платит за перевод каждого поля обратно в Python на каждом чтении, а protobuf-py уже сделал это при парсинге. На текстовых данных (посты, биографии, уведомления) экономия особенно заметна.

Rust-акселератор опционален и автоматически подгружается из prebuilt wheels. Чистый Python ведёт себя идентично.

Buf уже занимался инфраструктурой Protobuf — Buf CLI, Buf Schema Registry, ConnectRPC, Protovalidate, protobuf-es. Инженеры Buf участвовали в разработке Protobuf editions. Так что библиотеку написали люди, которые помогали писать сам стандарт.

Читать оригинал →