2012-05-18 6 views
7

私は私のプログラムを高速化するために、次のPythonの機能を置き換えるために、C++拡張機能を記述しようとしているを使用してパスPythonのリストブーストパイソン

Pythonの関数は、以下の

def calc_dist(fea1, fea2): 
    #fea1 and fea2 are two lists with same length 
    ... 
のように見えます

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

をして

のようなの.soファイルに上記のCPPコードをコンパイル:

は、私は次のようにC++とブーストのpythonを使用して関数を書きました

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を使ってC++拡張モジュールにPythonリストを渡しますか?

ありがとうございます!

+1

利用ブースト::のpython ::リストは、この質問[参照...あなたが始めるために十分近いです](http://stackoverflow.com/questions/3761391/boostpython-python-list-to-stdvector) –

答えて

8

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

ようになるはずですが、うまくいけば

+0

ありがとう、私はブーストのpythonの詳細を学ぶ必要があるようだ – user1403197

+0

私はちょうど一緒に、オンラインドキュメントから一緒に例を置くので、必要がありますあなたが進歩を遂げるための十分な情報になります。 – Useless

+0

Pythonリストからstd :: vectorへの自動変換が望まれます(間違いなく)。このコードは、正しいC++の引数型と必要な抽出が含まれているので、開始するだけで十分です。ありがとう! – ofloveandhate

関連する問題