繁体   English   中英

将列表从python传递到C ++向量时,如何加快Boost :: Python :: Extract

[英]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中看不到listVectorOfDoubles之间的区别,主要区别在于您可以像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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM