【问题标题】:How to speed up Boost::Python::Extract when passing a list from python to a C++ vector将列表从python传递到C++向量时如何加速Boost::Python::Extract
【发布时间】:2012-10-17 07:25:18
【问题描述】:

我是 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 倍)。

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

【问题讨论】:

  • 为什么不std::copy(boost::python::stl_input_iterator&lt;double&gt;(xl), boost::python::stl_input_iterator&lt;double&gt;(), xvals.begin());
  • 太棒了!这将数据输入到 C++ 的时间减少了一半以上。我必须承认,虽然我不太明白这意味着什么,但我想我会去查找 boost.python 迭代器文档。
  • 谁能解释为什么@ForEveR 的解决方案可以加快 OP 的代码速度?
  • @fireboot 我想这是因为std::copy 一次复制了一大块线性内存,而通过向量迭代复制每个元素的成本更高。

标签: c++ python performance list boost-python


【解决方案1】:

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

我建议在 python 中使用 std::vector&lt;double&gt;。为此,您可以将std::vector&lt;double&gt; 导出为class_,我们称之为VectorOfDOubles,使用boost python。你可以让它在 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&lt;double&gt; 子类,例如VectorOfDOubles,并定义double get(int i)void set(int i, double val),然后将这两个函数(连同size(),构造函数)导出到python。这需要对您的 python 代码进行一些更改,但对初学者来说更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 2012-05-25
    • 1970-01-01
    • 2016-12-21
    • 2019-12-01
    相关资源
    最近更新 更多