基于C ++的Google Protobuf python实现的性能

时间:2013-12-20 10:52:29

标签: c++ python protocol-buffers

我在Python应用程序中使用Google Protobuf。尝试使用protobufs我发现与基于Python的Python实现相比,基于CPP的python实现中的Protobuf Message Creation要慢得多。

与基于纯Python的Protobuf消息创建相比,使用PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION = cpp创建消息的速度要慢2-3倍。

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

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

(使用谷歌protobuf版本2.4.1)

1 个答案:

答案 0 :(得分:3)

是的,我相信这是预期的。纯Python实现将所有字段存储在dict中。要构造一条新消息,它基本上只创建一个空字典,这非常快。 C ++实现实际上初始化了引擎盖下的C ++ DynamicMessage对象,然后将其包装起来。 DynamicMessage实际上预先初始化了所有字段,因此即使它是用C ++实现的,它也“慢” - 但这种前期初始化使后续操作更快。

我相信你可以通过编译protobuf对象的C ++版本并将它们作为另一个扩展加载来进一步提高性能。如果我没记错的话,C ++支持的Python protobuf实现将自动使用编译版本而不是DynamicMessage