基于C++的Python谷歌原型的实现

基于C++的Python谷歌原型的实现,c++,python,protocol-buffers,C++,Python,Protocol Buffers,我在Python应用程序中使用Google Protobuf。通过对Protobuf的实验,我发现与基于python的python实现相比,基于CPP的python实现中的Protobuf消息创建要慢得多 使用PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp创建消息的速度比基于纯PYTHON的Protobuf消息创建慢2-3倍 这是预期的吗?我发现SerializeToString和ParseFromString在cpp verison中都更快。随着消息大小的

我在Python应用程序中使用Google Protobuf。通过对Protobuf的实验,我发现与基于python的python实现相比,基于CPP的python实现中的Protobuf消息创建要慢得多

使用PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp创建消息的速度比基于纯PYTHON的Protobuf消息创建慢2-3倍

这是预期的吗?我发现SerializeToString和ParseFromString在cpp verison中都更快。随着消息大小的增加,每种情况下的差异都会扩大

我正在使用python的标准timeit模块为这些任务计时


使用google protobuf的2.4.1版是的,我相信这是意料之中的。纯Python实现将所有字段存储在dict中。为了构造新消息,它实际上只创建一个空dict,这非常快。C++实现实际上是在引擎盖下初始化C++动态消息对象,然后封装它。DealMeCyMead实际上是预先初始化所有字段,所以即使它在C++中实现,也会慢一些,但是这种预先初始化使后面的操作更快。
<>我相信你可以通过编译你的原型BuffF对象的C++版本并将它们加载到另一个扩展中来进一步提高性能。如果我没记错的话,支持C++的Python protobuf实现将自动使用编译版本,而不是DynamicMessage。

是的,我相信这是意料之中的。纯Python实现将所有字段存储在dict中。为了构造新消息,它实际上只创建一个空dict,这非常快。C++实现实际上是在引擎盖下初始化C++动态消息对象,然后封装它。DealMeCyMead实际上是预先初始化所有字段,所以即使它在C++中实现,也会慢一些,但是这种预先初始化使后面的操作更快。
<>我相信你可以通过编译你的原型BuffF对象的C++版本并将它们加载到另一个扩展中来进一步提高性能。如果我没记错的话,支持C++的Python protobuf实现将自动使用编译后的版本,而不是DynamicMessage。

是否有文档说明如何做到这一点?我确实用-cpp_out方法编译了protobuf对象,但如何在python应用程序中使用它作为另一个扩展?发现它更详细地描述了您所指出的内容。谢谢虽然它并没有像预期的那样对我起作用。我无法构建和使用我的.proto文件的cpp实现。有关于如何实现的文档吗?我确实用-cpp_out方法编译了protobuf对象,但如何在python应用程序中使用它作为另一个扩展?发现它更详细地描述了您所指出的内容。谢谢虽然它并没有像预期的那样对我起作用。我无法构建和使用.proto文件的cpp实现