1

私は現在、作業中の C++ ライブラリの Python バインディングを作成しています。ライブラリはいくつかのバイナリ ファイル形式を読み取りますが、読み取り速度は非常に重要です。ライブラリの速度を最適化しているときに、std::vector (私が読んでいるインスタンスで使用) が多くの処理時間を消費していることに気付きました。良い/賢明なことはおそらく別の質問です)。

今、これらの配列へのPythonアクセスを許可する方法の問題に悩まされています。boost::python に組み込まれているソリューションはないようです (少なくとも 1 つを見つけることができませんでした)。

状況を説明するコード例:

// Instance.cpp
class Instance
{
    int * data;
    int dataLength;
    Instance ()
    {
        data = new int[10];
        dataLength = 10;
    }
};

// Class pythonBindings.cpp
BOOST_PYTHON_MODULE(db)
{
    class_<Instance>("Instance", init<>())
        .add_property("data", ........)
    ;
}

Pythonがアクセスしたいときはいつでも、配列からboost::python::listを構築するラッパー関数を使用できると思います。私はboost::pythonにまったく慣れていないので、ハッキングを始める前に、この問題に対する優れた標準または組み込みの解決策があるかどうかを尋ねる必要があると考えました。

では、 boost::python を使用してInstanceの配列をどのようにラップすることをお勧めしますか?data

4

2 に答える 2

4

クラスをstd::vectorインスタンスで動作するように変更する場合は、ベクター インデックス スイート ( http://www.boost.org/doc/libs/1_41_0/libs/python/doc/v2/indexing.html ) を参照してください。 Python から/へのコピーを作成せずに、ネイティブ リスト インターフェイスを使用して Python にベクトルを公開します。

于 2010-01-22T18:37:57.787 に答える
1

プロキシ クラスでラップ データと dataLength をお勧めし、インスタンスからこのプロキシを返します。私たちのプロジェクトでは、この方法を使用してアプリから Python にデータをエクスポートします。

必要に応じて、実装へのリンクをいくつか提供し、それがどのように機能するかを説明できます.

于 2009-12-11T11:18:26.947 に答える