【问题标题】:Pass python list to c++ extension using boost python使用 boost python 将 python 列表传递给 c++ 扩展
【发布时间】:2012-05-25 23:39:19
【问题描述】:

我正在尝试编写一个 c++ 扩展来替换以下 python 函数以加速我的程序

python函数如下所示

def calc_dist(fea1, fea2):
    #fea1 and fea2 are two lists with same length
    ...

我使用 c++ 和 boost python 编写了如下函数:

#include <vector>
#include <boost/python.hpp>
double calc_dist(vector<double>& fea1, vector<double>& fea2)
{
    int len = fea1.size();
    double s=0;
    for(int i=0; i<len;i++){
        double p=fea1[i];
        double q=fea2[i];
        ...//calculating..
    }
    return s;
}
BOOST_PYTHON_MODULE(calc_dist)
{
    using namespace boost::python;
    def("calc_dist",calc_dist);
}

并将上面的cpp代码编译成.so文件

g++ calc_dist.cpp -shared -fPIC -o calc_dist.so -I /usr/include/python2.6 -lboost_python

并尝试在python程序中使用.so,导入工作正常,表明模块可以成功导入。

但是,每当我将两个列表传递给函数的参数时,python 都会给出类似的错误

ArgumentError: Python argument types in
    calc_dist.calc_dist(list, list)
did not match C++ signature:
    calc_dist.calc_dist(std::vector<float, std::allocator<float> >,
                        std::vector<float, std::allocator<float> >)

谁能帮我解决这个问题?即使用 boost 将 python 列表传递给 c++ 扩展?

非常感谢!

【问题讨论】:

标签: c++ python list boost vector


【解决方案1】:

如果你想让它在 Python 列表上运行,你为什么要编写一个接受 std::vector 的函数?它们是不同的东西。

Boost.Python 将 python 列表公开为 list 类。

所以,你的函数应该看起来像

double calc_dist(boost::python::list fea1, boost::python::list fea2)
{
    boost::python::ssize_t len = boost::python::len(fea1);
    double s=0;
    for(int i=0; i<len;i++){
        double p = boost::python::extract<double>(fea1[i]);
        double q = boost::python::extract<double>(fea2[i]);
        ...//calculating..
    }
    return s;
}

它没有经过测试,但希望它足够接近让你开始......

【讨论】:

  • 我只是将在线文档中的示例放在一起,所以应该有足够的信息让您取得进步。
  • 毫无疑问,人们会(也许天真地)希望从 python 列表自动转换为 std::vector。这段代码足以开始,因为它包含正确的 C++ 参数类型和必要的提取。谢谢!
  • 为什么不自动转换为std::list,或deque,或其他? Python 列表不是向量,其行为也不像它们。
  • 您好,感谢您的热心回答,boost::python::list 的表现如何?
  • 可能取决于你用它做什么。与往常一样,最好的建议是尝试一下。
猜你喜欢
  • 2014-04-22
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
  • 2019-08-30
  • 2017-12-27
相关资源
最近更新 更多