我正在编写python程序,它需要处理大量小而复杂的protobuf编码消息。我试图使用协议缓冲区的Python实现,它是用纯Python编写的,但是它的性能非常糟糕。在
所以我正在研究一个解决方案,显然是{a1}——使用PotoC生成C++文件,然后使用SWIG将它们用Python包起来。问题是我无法访问一个工作的Python模块。在
使用-includeall
运行swig时,到
确保生成的
消息类也会被包装-swig失败,抱怨缺少系统包含文件(例如“string”)。我不能用-I标志或复制整个include目录来解决这个问题。环境是ubuntu10.04,protobuf 2.2.0,swig1.3.40,gcc4.4.3。
没有这个标志,我可以为 消息类,但是这个模块是无用的:生成的Python 消息类缺少消息提供的所有函数 基类-尤其是 反序列化方法。剩下的唯一方法 (MergePartialFromCodedStream)无法运行,因为它需要输入 CodedInputStream类型的流(即 是protobuf基础设施的一部分,因此没有被包装 用swig)。
或者-是否有其他解决方案的例子,比如同一页中提到的Python扩展?虽然对于我的动态模式来说这似乎是一个高维护性的解决方案。。。在
如果这些都不起作用,我会考虑放弃python而支持Groovy——假设协议缓冲区的Java实现会更高效。对此有何评论?在
谢谢你!在
这是我最后使用的Greplin fast-python-pb解决方案的正确链接。 它非常容易使用(至少在Linux中),性能提高了100倍。在
与Google软件相比,这100%的可选值仍然是可以兼容的,但至少这100%与Google的实现值是相当小的差异。在
New version of Protobuf supports using the fast C++ implementation of Protobuf使用Python代码。设置环境变量PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp。在
尝试在SWIG文件和基类文件中显式地包含生成的头文件(而不是使用includeall)。您应该能够足够明确,让SWIG理解您想要绑定基类和派生类。在
相关问题 更多 >
编程相关推荐