2016-08-10 10 views
0

タイトルが混乱する可能性があります。ここで私は質問をより明確に述べます。あまりにも多くのコピーを含めることなく、PythonコンテキストからC++にデータを送る良い方法はありますか?

Python(FlaskやcherryPyのような既存のフレームワークがたくさんあります)と、処理速度のためにC++計算エンジンに基づいてWebサイトを作成したいと考えています。ですから、PythonがC++関数を呼び出すためのインタフェースを作成する必要があります。幸運にも、boost.pythonはその仕事をすることができます。しかし、私はPythonからデータをC++に送るたびに、python listを使う必要があります。つまり、行列データをリストに変換し、C++コンテキストでリストを内部の行列オブジェクトに変換する必要があります。その結果、多くのデータコピーが発生し、インテリジェントで効率的なアプローチではありません。ですから、私の質問は、複雑さを考慮して、boost.pythonを使ってC++の行列クラスをpythonクラスにマップしないと、少数のコピーでのみ、同様の作業を行う良い方法がありますか?

+0

あなたはマトリックスとあなたたい仕事ならば、直接numpyのを使用して試みることができます。これは速い。 – user357269

+0

numpyは良いですが、大きなデータの問題では、C++が高速だと思います。だからこそ私は計算エンジンとしてC++実装の関数を使いたい – doody1986

答えて

2

しかし、私はC++に、行列を言う、のpythonからデータを送信するたびに、私はリストにしてCで行列に データを変換する必要があることを意味する、Pythonのリストを使用する必要が ++コンテキスト変換内部 行列オブジェクトにリストします。

いいえ、あなたはPythonリストを使用する必要はありません。データをC連続セグメントとして割り当てるnumpy配列を使用することができます。このセグメントは、コピーせずにC++に渡すことができ、行列ラッパークラスを使用して行列として表示することができます。 C++のpythonに公開されている関数の下に使用して

>>> y=np.empty((2,5), dtype=np.int16) 
>>> y 
array([[ 12, 27750, 26465, 2675,  0], 
     [ 0,  0,  0, 2601,  0]], dtype=int16) 
>>> y.flags['C_CONTIGUOUS'] 
True 
>>> foo(y,2,5) 

パス行列データ:Pythonで

はnumpyのを使用して2D配列を割り当てる

void foo(python::object obj, size_t size1, size_t size2) 
{ 
    PyObject* pobj = obj.ptr(); 
    Py_buffer pybuf; 
    PyObject_GetBuffer(pobj, &pybuf, PyBUF_SIMPLE); 
    void *buf = pybuf.buf; 
    int16_t *p = (int16_t*)buf; 
    Py_XDECREF(pobj); 

    MyMatrixWrapper matrix(p, size1, size2); 
    // .... 
} 
関連する問題