我在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)
答案 0 :(得分:3)
是的,我相信这是预期的。纯Python实现将所有字段存储在dict中。要构造一条新消息,它基本上只创建一个空字典,这非常快。 C ++实现实际上初始化了引擎盖下的C ++ DynamicMessage
对象,然后将其包装起来。 DynamicMessage
实际上预先初始化了所有字段,因此即使它是用C ++实现的,它也“慢” - 但这种前期初始化使后续操作更快。
我相信你可以通过编译protobuf对象的C ++版本并将它们作为另一个扩展加载来进一步提高性能。如果我没记错的话,C ++支持的Python protobuf实现将自动使用编译版本而不是DynamicMessage
。