2012-05-18 15 views
7

Estoy intentando escribir una C++ extensión para reemplazar la siguiente función de pitón con el fin de acelerar mi programaPass lista de Python a C++ extensión utilizando impulso pitón

La función de Python tiene el siguiente

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

escribí la función usando C++ y Python impulso como sigue:

#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); 
} 

y compilar el código CPP anterior en un archivo .so como

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

y tratando de usar .so en un programa python, la importación funciona bien, lo que indica que el módulo puede importarse con éxito.

Sin embargo, cuando paso dos listas para el parámetro a la función, pitón dará errores como

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> >) 

puede alguien ayudarme cómo resolver este problema? Es decir, ¿pasar una lista de Python a la extensión de C++ usando boost?

¡Muchas gracias!

+1

Uso impulso :: :: ver [a esta pregunta ] (http://stackoverflow.com/questions/3761391/boostpython-python-list-to-stdvector) –

Respuesta

8

¿Por qué escribió una función que acepta std::vector si desea que funcione en una lista de Python? Son cosas diferentes.

Boost.Python expone las listas de Python como la clase list.

lo tanto, su función de ser semejante a lo

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; 
} 

que no está probado, pero espero que esté lo suficientemente cerca para que pueda empezar ...

pitón lista
+0

Gracias, parece que debería aprender más sobre boost python – user1403197

+0

Acabo de poner el ejemplo de los documentos en línea, por lo que debería ser suficiente información para que progreses. – Useless

+0

uno (quizás ingenuamente) espera una conversión automática de una lista de python a std :: vector, sin dudas. este código es más que suficiente para comenzar, ya que incluye un tipo de argumento C++ correcto y el extracto necesario. ¡Gracias! – ofloveandhate

Cuestiones relacionadas