Python 使用swig绑定google协议缓冲区

Python 使用swig绑定google协议缓冲区,python,performance,optimization,swig,protocol-buffers,Python,Performance,Optimization,Swig,Protocol Buffers,我正在编写python程序,该程序需要处理大量小而复杂的protobuf编码消息。我尝试使用协议缓冲区的Python实现,它是用纯Python编写的,但是它的性能非常糟糕 所以我正在研究一个解决方案,显然使用PotoC生成C++文件,然后使用SWIG用Python来包装它们。问题是我无法访问一个正常工作的Python模块 使用-includeal运行swig时,要 确保生成的 消息类也会被包装-swig失败,抱怨缺少系统包含文件(例如“字符串”)。我无法使用-I标志或复制整个include目录

我正在编写python程序,该程序需要处理大量小而复杂的protobuf编码消息。我尝试使用协议缓冲区的Python实现,它是用纯Python编写的,但是它的性能非常糟糕

所以我正在研究一个解决方案,显然使用PotoC生成C++文件,然后使用SWIG用Python来包装它们。问题是我无法访问一个正常工作的Python模块

  • 使用
    -includeal
    运行swig时,要 确保生成的 消息类也会被包装-swig失败,抱怨缺少系统包含文件(例如“字符串”)。我无法使用-I标志或复制整个include目录来解决这个问题。环境是Ubuntu 10.04、protobuf 2.2.0、swig 1.3.40、gcc 4.4.3

  • 没有这个标志,我就能够为我的 消息类,但这个模块是无用的:生成的Python 消息类缺少消息提供的所有函数 基类-尤其是除一个以外的所有 反序列化方法。剩下的一种方法 (MergePartialFromCodedStream)无法运行,因为它需要输入 CodedInputStream类型的流(即 protobuf基础设施的一部分,因此未包装 用swig)

我想知道是否有人有一个让swig在protobuf-C++之上工作的工作示例

或者-是否有其他解决方案的示例,例如同一页中提到的Python扩展?虽然这似乎是我的动态模式的高维护解决方案

如果这一切都不起作用,我将考虑放弃python而代之以Groovy——假设协议缓冲区的Java实现会更高效。对此有何评论


谢谢你

尝试在SWIG文件和基类文件中显式地包含生成的头文件(而不是使用includeal)。您应该能够足够明确,使SWIG理解您想要绑定基类和派生类。

这里是我最终使用的解决方案的正确链接。 它非常易于使用(至少在Linux中是如此),而且性能提高了x100倍


这个软件还很年轻,与Google的实现还不是100%兼容,至少在可选字段中的空值方面是如此,但与Python代码的差异非常小。设置环境变量PROTOCOL\u BUFFERS\u PYTHON\u IMPLEMENTATION=cpp。

谢谢John。。。我最终通过使用Greplin工具()解决了这个问题-强烈推荐!