2012-05-18 11 views
7

Ich versuche, eine C++ Erweiterung zu schreiben, die folgende Python-Funktion zu ersetzen, um mein Programm zu beschleunigenPass Python Liste C++ Erweiterung mit boost Python

Die Python-Funktion wie folgt

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

ich schrieb die Funktion C++ und Boost-python wie folgt:

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

und übersetzen Sie die oben cpp Code in eine .so-Datei wie

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

und versuchen, die .so in einem Python-Programm zu verwenden, funktioniert der Import gut, was darauf hinweist, dass das Modul erfolgreich importiert werden kann.

Jedes Mal, wenn ich zwei Listen an die Parameter an die Funktion übergeben, wird Python geben Fehler wie

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

kann mir helfen, wie dieses Problem zu lösen? d., übergeben Sie eine Python-Liste an die C++ Erweiterung mit boost?

Vielen Dank!

+1

Verwendung boost :: Python :: Liste [diese Frage ] (http://stackoverflow.com/questions/3761391/boostpython-python-list-to-stdvector) –

Antwort

8

Warum haben Sie eine Funktion geschrieben, die std::vector akzeptiert, wenn Sie möchten, dass sie auf einer Python-Liste läuft? Sie sind verschiedene Dinge.

Boost.Python macht Python-Listen als list-Klasse verfügbar.

So sollte Ihre Funktion in etwa so aussehen

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

es nicht getestet wird, aber hoffentlich ist nahe genug, um Ihnen den Einstieg ...

+0

Danke, scheint, ich sollte mehr über Boost Python lernen – user1403197

+0

Ich habe nur das Beispiel aus den Online-Dokumenten zusammen, so sollte es genug Informationen für Sie, um Fortschritte zu machen. – Useless

+0

würde man (naiv) hoffentlich auf eine automatische Konvertierung von einer Python-Liste in einen std :: vector hoffen. Dieser Code ist mehr als genug, um loszulegen, da er einen korrekten C++ - Argumenttyp und den notwendigen Extrakt enthält. Vielen Dank! – ofloveandhate

Verwandte Themen