2

我是 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 倍,但当然单独的分箱算法要快得多(74 倍)。

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

4

1 回答 1

1

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

我建议改用std::vector<double>已经在 python 中使用。为此,您可以使用 boost python将其导出std::vector<double>class_,我们称之为。VectorOfDOubles你可以让它在python中你不会看到和之间的区别listVectorOfDoubles主要区别在于你构造它xl = VectorOfDoubles(55)而不是xl = []。您需要做一些工作才能使 index-acees 正常工作,例如 xl[5] = 4.5,但为此存在 boost 索引套件,我推荐版本 2,以帮助您。

另一种选择是使用 numpy ndarrays 而不是list. 存在 boost numpy 库,可帮助您使用 boost python 中的 numpy ndarrays。

但是正如您所说,您是 boost python 的新手,boost numpy 和 boost indexing suite 都可能有点困难。也许您首先想解决创建自己的子类std::vector<double>,比如VectorOfDOubles定义double get(int i)void set(int i, double val)然后将这两个函数(连同 size(),构造函数)导出到 python。这需要对您的 python 代码进行一些更改,但对初学者来说更容易。

于 2012-11-07T11:11:29.560 回答