从boost python返回一个c ++数组(指针)

时间:2009-09-11 11:03:37

标签: python boost binding boost-python

我正在为我正在研究的c ++库编写python绑定。该库读取一些二进制文件格式,读取速度非常重要。在优化库的速度时,我注意到std :: vector(在我正在阅读的实例中使用)占用了大量的处理时间,所以我用新的[]分配了简单的数组(不管这是不是好的/明智的事情可能是另一个问题。)

现在我遇到了如何让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包装Instance的{​​{1}}数组?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

我将使用代理类推荐一个wrap数据和dataLength,并从Instance这个代理返回。在我们的项目中,我们使用这种方式将数据从我们的应用程序导出到python。

如果您愿意,我可以为您提供一些指向我们实施的链接,并解释它是如何运作的。