使用boost python将python列表传递给c ++扩展

use*_*197 9 c++ python boost list vector

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

python函数如下所示

def calc_dist(fea1, fea2):
    #fea1 and fea2 are two lists with same length
    ...
Run Code Online (Sandbox Code Playgroud)

我用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);
}
Run Code Online (Sandbox Code Playgroud)

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

g++ calc_dist.cpp -shared -fPIC -o calc_dist.so -I /usr/include/python2.6 -lboost_python
Run Code Online (Sandbox Code Playgroud)

并尝试在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> >)
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我解决这个问题吗?即使用boost将python列表传递给c ++扩展?

非常感谢!

Use*_*ess 11

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

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

所以,你的功能看起来应该是这样的

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;
}
Run Code Online (Sandbox Code Playgroud)

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