2

私はboost.pythonが初めてで、PythonからC++ベクトルにリストを渡すための簡単な関数を作成しました:

void SetXValues(boost::python::list xl){
    int n = len((xl));
    xvals.resize(n);
    for(unsigned int i=0; i<n; i++){
    xvals[i] = boost::python::extract<double>((xl)[i]);
    }
}

xvals は C++ STL ベクトルです。この関数は機能し、Python リストを C++ にロードできますが、非常に遅いようです。

私が行った小さな速度テストは、C++ と純粋な Python でビニング アルゴリズムを作成することでした。結果は、Python からデータを渡す時間を含めると、C++ メソッドは 5 倍高速であるにすぎないことを示していますが、もちろんビニング アルゴリズムだけではかなり高速です (74 倍)。

では、上記の機能を改善してより効率的にする方法はありますか?

4

1 に答える 1

1

あなたが説明するようなパフォーマンスの重要な部分で。list私は通常、そもそもデータを python に保存することを避けます。Alistは、任意のオブジェクトを格納するための正しいデータ型です。特に、リスト内のすべてのオブジェクトは異なるタイプを持つことができます。しかし、それが「double のリスト」になることはすでにご存じでしょう。

std::vector<double>代わりに、既に Python で使用することをお勧めします。そのためには、boost python を使用して としてエクスポートstd::vector<double>し、class_それを と呼びましょう。Python ではとVectorOfDOublesの違いが見られないようにすることができます。主な違いは、 の代わりに のように構築することです。index-acees を機能させるには少し作業が必要です (例: xl[5] = 4.5)。しかし、このためにはブースト インデックス スイートが存在します。バージョン 2 をお勧めします。listVectorOfDoublesxl = VectorOfDoubles(55)xl = []

別の代替手段は、の代わりに numpy ndarrays を使用することですlist。ブースト python から numpy ndarrays を操作するのに役立つブースト numpy ライブラリが存在します。

しかし、あなたが Python をブーストするのは初めてだと言うように、ブースト numpy とブースト インデックス スイートの両方が少し難しいかもしれません。std::vector<double>おそらく、最初に、たとえば、およびVectorOfDOubles定義の独自のサブクラスを作成して解決し、これら 2 つの関数を (コンストラクターである size() と共に) Python にエクスポートすることをお勧めします。これには、Python コードにいくつかの変更が必要ですが、初心者にとっては簡単です。double get(int i)void set(int i, double val)

于 2012-11-07T11:11:29.560 に答える