[英]How to speed up Boost::Python::Extract when passing a list from python to a C++ vector
我是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]);
}
}
xvals是C ++ STL向量。 此函数有效,我可以将python列表加载到C ++中,但它看起来非常慢。
我所做的一个小速度测试是用C ++和纯Python编写分箱算法。 结果表明,当包括从Python传递数据的时间时,C ++方法仅快5倍,但是当然,单独的装箱算法要快得多(74x)。
那么,有什么方法可以改善上述功能,使其更加高效?
在性能至关重要的部分,例如您所描述的。 我通常首先避免将数据存储在python list
中。 list
是正确的数据类型,可以在其中存储任意对象。 特别是列表中的每个对象都可以具有不同的类型。 但是您已经知道这将是“双打列表”。
我建议改为在python中使用std::vector<double>
。 为此,您可以将std::vector<double>
导出为class_
,使用boost python将其VectorOfDOubles
。 您可以这样做,以便在python中看不到list
和VectorOfDoubles
之间的区别,主要区别在于您可以像xl = VectorOfDoubles(55)
而不是xl = []
那样构造它。 您需要做一些工作才能使索引ace工作,例如xl [5] = 4.5,但是为此,存在boost索引套件,我建议使用版本2,以帮助您。
另一种选择是使用numpy ndarrays而不是list
。 存在boost numpy库,可帮助您使用boost python中的numpy ndarrays。
但是正如您所说的,您是增强python的新手,但是增强numpy和boost索引套件都可能有点困难。 也许您首先想用自己的std::vector<double>
子类来解决,例如说VectorOfDOubles
,并定义double get(int i)
和void set(int i, double val)
,然后导出这两个函数(以及size(),构造函数)转换为python。 这需要对您的python代码进行一些更改,但对于初学者来说更容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.