2009-09-11 80 views
1

我目前正在为我正在编写的C++库编写python绑定。该库读取一些二进制文件格式和阅读速度非常重要。在优化库的速度时,我注意到std :: vector(用在我正在读的实例中)消耗了大量的处理时间,所以我用简单的数组替换了新的[](无论这是好的/明智的事情可能是另一个问题)。从boost python返回一个c + +数组(指针)

现在我坚持如何给这些数组的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", ........) 
    ; 
} 

我想我可以用它构建一个boost ::蟒蛇::名单出来时蟒蛇想访问他们的阵列的包装功能。由于我对boost :: python相当陌生,我想我应该问在我开始黑客入侵之前是否有任何好的,标准或内置的解决方案来解决这个问题。

那么,你会如何推荐使用boost :: python包装Instancedata数组?

+0

如果给它一个尺寸提示,向量不应该比数组慢。你确定你已经开启了优化器吗? (这是一个容易犯的错误。) – 2009-09-11 12:41:41

+0

好的一点,虽然检查我的初始版本,我注意到,我没有指定初始大小和使用push_back代替。我会看到它使用正确的std :: vector运行得有多快。谢谢! – 2009-09-11 12:49:48

+1

事实证明,更改为c风格的数组是不成熟的:使用std :: vector结果是一样快,只要您适当地使用reserve()和编译器优化。 (不知道这应该是一个评论或对我自己的问题的答案) – 2009-12-11 11:24:32

回答

1

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

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