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