从Boost Python返回C++数组(指针)

1 投票
2 回答
3966 浏览
提问于 2025-04-15 14:14

我现在正在为一个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数组呢?

2 个回答

1

我建议用一个代理类来包装数据和数据长度,然后从这个代理类的实例中返回数据。在我们的项目中,我们就是用这种方法把数据从我们的应用导出到Python。

如果你需要的话,我可以给你一些我们实现的链接,并解释一下它是怎么工作的。

4

如果你把你的类改成可以使用 std::vector 的话,可以看看向量索引的相关内容(http://www.boost.org/doc/libs/1_41_0/libs/python/doc/v2/indexing.html)。这样可以让你在 Python 中使用向量,就像使用原生的列表一样,而且不需要在 Python 和 C++ 之间复制数据。

撰写回答