如何加快Boo::Python::从Python传递列表到C++时提取

2024-10-04 07:29:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我是新手boost.python并将Python的列表传递给C++向量:

void SetXValues(boost::python::list xl){
    int n = len((xl));
    xvals.resize(n);
    for(unsigned int i=0; i<n; i++){
    xvals[i] = boost::python::extract<double>((xl)[i]);
    }
}
是一个C++ STL向量。这个函数可以工作,我可以把Python列表加载到C++中,但是它看起来非常慢。在

一个小的速度测试,是在C++和纯Python中编写一个装箱算法。结果表明,当从Python中传递数据的时间时,C++方法只快5倍,但当然,单独的计算算法要快得多(7X)。在

那么,有没有什么方法可以改进上面的功能,让它更高效呢?在


Tags: 方法算法列表forlen向量listint
1条回答
网友
1楼 · 发布于 2024-10-04 07:29:47

在性能关键的部分,如你所描述的。我通常首先避免在python list中存储数据。list是存储任意对象的正确数据类型。特别是列表中的每个对象都可以有不同的类型。但你已经知道这将是一个“双打名单”。在

我建议在python中使用std::vector<double>。为此,您需要将std::vector<double>导出为class_,让我们使用boostpython将其称为VectorOfDOubles。您可以使其在python中看不到list和{}之间的区别,主要的区别在于您将其构造为xl = VectorOfDoubles(55),而不是{}。你需要做一点工作来让索引ace工作,例如xl[5]=4.5,但是对于这个,有一个boost索引套件,我推荐版本2,来帮助你。在

另一种选择是使用numpy ndarrays而不是list。有一个boostnumpy库可以帮助您使用boostpython中的numpyndarray。在

但正如您所说的,您对boostnumpy和boost索引套件可能有点困难。也许您首先想通过创建自己的std::vector<double>的子类,比如VectorOfDOubles,然后定义double get(int i)和{},然后将这两个函数(连同size(),构造函数)导出到python。这需要对python代码进行一些更改,但对于初学者来说更容易。在

相关问题 更多 >