【问题标题】:Returning a c++ array (pointer) from boost python从 boost python 返回一个 c++ 数组(指针)
【发布时间】:2009-09-11 11:03:36
【问题描述】:

我目前正在为我正在开发的 c++ 库编写 python 绑定。该库读取一些二进制文件格式,读取速度非常重要。在优化库以提高速度时,我注意到 std::vector (在我正在阅读的实例中使用)占用了大量的处理时间,所以我用 new[] 分配的简单数组替换了那些(无论这是好的/明智的做法可能是另一个问题)。

现在我遇到了如何让 python 访问这些数组的问题。 boost::python 中似乎没有内置解决方案(至少我找不到)。

示例代码说明情况:

// Instance.cpp
class Instance
{
    int * data;
    int dataLength;
    Instance ()
    {
        data = new int[10];
        dataLength = 10;
    }
};

// Class pythonBindings.cpp
BOOST_PYTHON_MODULE(db)
{
    class_<Instance>("Instance", init<>())
        .add_property("data", ........)
    ;
}

我想我可以使用一个包装函数,只要 python 想要访问它们,就可以从数组中构造一个 boost::python::list。由于我对 boost::python 还很陌生,所以我想在我开始破解之前,我应该问问是否有任何好的、标准或内置的解决方案来解决这个问题。

那么,您如何建议使用 boost::python 包装 Instancedata 数组?

【问题讨论】:

  • 如果你给它一个大小提示,向量不应该明显比数组慢。你确定你打开了优化器? (这是一个容易犯的错误。)
  • 好点,在检查我的初始版本时,我注意到我没有指定初始大小,而是使用 push_back。我会看看它在正确使用 std::vector 的情况下运行得有多快。谢谢!
  • 事实证明,更改为 c 风格的数组还为时过早:如果您适当地使用 reserve() 和编译器优化,使用 std::vector 的速度也一样快。 (不确定这应该是评论还是对我自己问题的回答)

标签: python boost binding boost-python


【解决方案1】:

如果您将类更改为使用 std::vector 实例,请查看向量索引套件 (http://www.boost.org/doc/libs/1_41_0/libs/python/doc/v2/indexing.html),它允许您使用本机列表接口向 python 公开向量,而无需从/到创建副本蟒蛇。

【讨论】:

    【解决方案2】:

    我将推荐使用代理类包装数据和数据长度,并从实例返回此代理。在我们的项目中,我们使用这种方式将数据从我们的应用程序导出到 python。

    如果你愿意,我可以给你几个链接到我们的实现,并解释它是如何工作的。

    【讨论】:

      猜你喜欢
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      • 2012-10-02
      • 2020-09-16
      • 2014-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多