ここに問題があります:Pythonでプラグイン可能な関数の 'daisychaining'を実装する方法は?
1)メジャーデータ(私のエレクトロニクスから読み取った1Mサンプルのようなもの)があり、それを処理チェーンで処理する必要があるとします。
2)この処理チェーンは異なる操作で構成され、スワップ/省略/異なるパラメータを持つことができます。典型的な例は、ルックアップテーブルを介して最初にそれらを渡し、次に指数関数的な適合を行い、いくつかの較正係数を乗算することです。
3)今、私はどのアルゴリズムが最良か、各段階で最良の実装を評価するのが好きです(例として、LUTは5つの方法で作成でき、どちらが最適かを知りたい)
4)これらの関数をデイジーチェーンしたいので、トップレベルのアルゴリズムを含む「クラス」を構築し、より低いレベルのアルゴリズムを含む子クラスを所有する(すなわち、指し示す)ことを意味する。
私は、二重リンクリストを使用してのようなシーケンスを生成するために考えていた:
myCaptureClass.addDataTreatment(pmCalibrationFactor(OPT、pmExponentialFit(OPT、pmLUT(OPT))))
myCaptureClassがある(データの取得後に)トップレベルのデータ処理モジュール(pm)をトリガする必要があります。この処理は、最初にボトム・チャイルド(lut)に深く入り、そこでデータを処理し、次に中間(expofit)、次にトップ(カリファクタ)にデータを戻してキャプチャに戻し、リクエスタにデータを戻します。
今これは、いくつかの問題があります。ネット上のどこでも
1)は、Pythonのいずれかに 2ダブルリンク・リストを使用してはならないと言われている)のデータベクトルが巨大であるため、これは、私には非常に非効率ですしたがって、私は、ジェネレータ機能を使用してソリューションを好むが、私はどのように 'プラグインのような'メカニズムを提供するか分からない。
「プラグインスタイル」とジェネレータを使用してこの問題を解決する方法を教えてもらうことができますので、ジェネレータ機能を使用するときにXメガバイトのデータを処理して「オンリクエスト」を処理する必要はありません?問題へ
おかげでたくさん
デビッド
補遺:
私がまさに自分自身を表現していなかったようです。したがって、データはVMEクレートに接続された外部HWカードによって生成されます。それらはmyCaptureClassに格納されているpythonタプルへの単一のブロック転送で 'フェッチ'されます。
適用される操作のセットは、実際にはこのタプルで表されるストリームデータです。指数関数的フィットでさえ、ストリーム操作です(各サンプルに適用される可変状態フィルターのセットです)。
私が間違って表示したパラメータは、データ処理クラスのそれぞれに付属する設定データがあり、データの操作に使用するメソッドの動作を変更するということです。
目的は、ユーザーがデータを要求したときに最終的な形式にデータを処理するために使用される(関数ではなく)daisychainedクラスをmyCaptureClassに導入することです。
メモリリソースを「節約する」ために、データを提供するためにジェネレータ機能を使用することをお勧めします。
これは、私がしたいことに最も近いものがbukzorのコードに表示されているようです。私は、関数の代わりにクラスの実装を持っているが、私はこれはちょうどを実装する化粧品だと思いますデータ操作を実現する特定のクラスの演算子を呼び出します....
あなたは私たちに、入力/出力の簡単な例を与えることができれば、我々は具体的な答えを与えることができます。 – bukzor
C++で二重リンクリストが必要な場合は、Pythonリストを使用する必要があります。 – bukzor