использование swig для привязки буферов протокола Google

Я пишу программу python, которая должна обрабатывать множество небольших, но сложных сообщений, закодированных в protobuf. Я попытался использовать Python-реализацию буферов протоколов, написанную на чистом питоне, но ее производительность действительно ужасна.

Поэтому я ищу решение, которое, по-видимому, некоторым людям приходилось работать – используйте protoc для создания файлов на C ++, а затем используйте swig для их переноса с помощью python. Проблема в том, что я не могу добраться до рабочего модуля Python.

  • При запуске swig с -includeall , чтобы все классы базы Google / -includeall , используемые порожденными классами сообщений, также были обернуты – swig терпит неудачу, жалуясь на отсутствие системных файлов (например, «строка»). Я не мог обойти это с флагами -I или копированием целых каталогов include. Окружающая среда – Ubuntu 10.04, protobuf 2.2.0, swig 1.3.40, gcc 4.4.3.

  • Без этого флага я могу создать модуль python для своих классов сообщений, но этот модуль бесполезен: в сгенерированных классах сообщений Python отсутствуют все функции, предоставляемые базовым классом Message – в частности, все, кроме одного, методы сериализации. Один метод слева (MergePartialFromCodedStream) не будет запущен, потому что для него требуется входной поток типа CodedInputStream (который является частью инфраструктуры protobuf и поэтому не был обернут swig).

Мне было интересно, есть ли у кого-нибудь рабочий пример того, как заставить swig работать поверх protobuf-C ++?

В качестве альтернативы – есть ли пример какого-либо другого решения, такого как расширение Python, упомянутое на той же странице? Хотя это похоже на решение с высоким уровнем обслуживания для моей динамической схемы …

Если это не работает, я рассматриваю возможность сброса python в пользу Groovy – если предположить, что реализация буферов протокола Java будет более эффективной. Есть ли комментарии по этому поводу?

Большое спасибо!

3 Solutions collect form web for “использование swig для привязки буферов протокола Google”

Новая версия Protobuf поддерживает использование быстрой реализации C ++ Protobuf с кодом Python. Установите переменную среды PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION = cpp.

Вот правильная ссылка на решение fast-python-pb Greplin, которое я использовал. Он очень прост в использовании (по крайней мере, в Linux), а производительность – х100 раз.

Это программное обеспечение все еще молод и не на 100% совместимо с реализацией Google, по крайней мере, в отношении пустых значений в необязательных полях – но различия довольно незначительные.

Попробуйте% включить ваши созданные заголовки в ваш SWIG-файл, а также файлы базового класса явно (вместо использования includeall). Вы должны быть достаточно ясными, чтобы SWIG понимал, что вы хотите привязать базовые классы и производные.

  • Wrap std :: вектор std :: векторов, C ++ SWIG Python
  • Обтекание C-enum в модуле Python с помощью Swig
  • Передача bool по ссылке с помощью SWIG и Python
  • Как глобальные переменные C / C ++ реализованы в python?
  • Как использовать список Python для назначения std :: vector в C ++ с помощью SWIG?
  • Как создать карту типа OUTPUT для типа класса?
  • Как создать экземпляр метода шаблона класса шаблона с помощью swig?
  • Использование distutils, где файл интерфейса swig находится в папке src
  • Быстрое преобразование вектора C / C ++ в массив Numpy
  • Тривиальный вопрос об ошибке SWIG Python
  • SWIG не может преобразовать тип typedef
  •  
    Interesting Posts for Van-Lav

    Как я должен учитывать накладные расходы subprocess.Popen () при выборе времени в python?

    Python: как заменить подстроки в строке, указанной в списке индексов

    Пример регулярного выражения Python

    Построение с прозрачным маркером, но непрозрачным краем

    Вызов функции MATLAB в программе Python

    наиболее эффективный способ анализа этого языка сценариев

    sklearn.ensemble.AdaBoostClassifier не может использовать SVM как base_estimator?

    Существуют ли какие-либо рекомендации для выбора количества процессов с многопроцессорной обработкой?

    Python установить понимание для 2.6

    Список со многими словарями VS словарь с несколькими списками?

    Самонастраивающийся Python? Как я могу перенаправить все операторы печати внутри функции, не касаясь sys.stdout?

    Количество секунд с начала дня Часовой пояс UTC

    Установка значения по умолчанию для поля в наборе форм в Django

    Защита пароля MySQL при разработке в Python?

    библиотека для преобразования дерева узлов

    Python - лучший язык программирования в мире.