【问题标题】:Performance of C++ based python implementation of Google ProtobufGoogle Protobuf 的基于 C++ 的 python 实现的性能
【发布时间】:2013-12-20 10:52:29
【问题描述】:

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

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

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

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

(使用 google protobuf 2.4.1 版)

【问题讨论】:

    标签: c++ python protocol-buffers


    【解决方案1】:

    是的,我相信这是意料之中的。纯 Python 实现将所有字段存储在一个字典中。要构造一条新消息,它本质上只是创建一个空字典,速度非常快。 C++ 实现实际上在底层初始化了一个 C++ DynamicMessage 对象,然后包装它。 DynamicMessage 实际上是预先初始化了所有字段,所以即使它是用 C++ 实现的,它也“更慢”——但是这种预先初始化使后面的操作更快。

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

    【讨论】:

    • 有没有关于如何做到这一点的文档?我确实使用 --cpp_out 方法编译了我的 protobuf 对象,但是如何在我的 python 应用程序中将其用作“另一个扩展”?
    • 找到yz.mit.edu/wp/fast-native-c-protocol-buffers-from-python,它更详细地描述了您所指出的内容。谢谢!
    • 虽然它并没有像预期的那样对我有用。我无法构建和使用 .proto 文件的 cpp 实现
    猜你喜欢
    • 1970-01-01
    • 2010-12-15
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多