1

私が持っている 2 つのスクリプト間の相互作用を最適化しようとしています。私が考えた2つのことは、手動で強制終了しない限り終了しないc ++プログラム、またはc ++に供給する前にpythonですべての情報を生成することです。

問題の説明:

スクリプトが行うこと: C++ プログラム (私が作成したものではありません。また、C++ でうまくプログラミングすることはできません): 7 つの数値配列を受け取り、単純な単一の数値を返します。Python スクリプト (私のもので、Python で少しプログラミングできます): これらの 7 つの数値配列を生成し、それらを C++ プログラムにフィードし、回答を待ってリストに追加します。次に、次の配列を作成します。

理論的には、これは機能します。ただし、現在のように、呼び出しごとに c++ プログラムを開いたり閉じたりします。1 つのアレイについては問題ありませんが、25,000 のアレイにアップスケールしようとしています。将来的には 600 万以上のアレイに拡張しようとしています。特にC++プログラムが機能するために最初に130MBのVCDファイルをロードする必要があるため、毎回それを開いたり閉じたりすることはもはや現実的ではありません。

私が自分で考えた 2 つのオプションは、最初にすべての配列を Python で生成し、次にそれらを C++ プログラムにフィードしてから、すべての結果を分析することでした。ただし、6M 配列でこれを行う方法はわかりません。ただし、返される結果がフィードする配列と同じ順序であることは重要ではありません。

私が考えた 2 番目のオプションは、呼び出しのたびに C++ プログラムが終了しないようにすることでした。ただし、C ++でプログラムすることはできないので、これが可能かどうかはわかりません。「生きている」状態を維持して、時々配列をフィードして答えを得ることができます。

(注: 私は Python 以外でプログラミングすることはできず、このプロジェクトを Python で実行したいと考えています。速度上の理由から、C++ プログラムを Python に変換することはできません。)

前もってありがとう、マックス。

4

5 に答える 5

1

まず、単純に言えば、通常の使用では C++ スクリプトはありません。C++ は最終的に機械語にコンパイルされ、C++ プログラムは適切に「スクリプト」ではなく「プログラム」と呼ばれます。

しかし、あなたの質問に答えるために、実際に C++ プログラムを設定して、接続をリッスンし、Python スクリプトに応答を送信するメモリ内に留まるようにすることができます。Unix IPC、特にソケットについて勉強したいと思うでしょう。

別の方法としては、C++ プログラムが行うことを Python スクリプトに組み込み、C++ を完全に忘れることです。

于 2011-01-28T10:18:20.067 に答える
1

Pythonスクリプトと C++プログラムのソース コードまたは正確な仕様がなければ、詳細な情報を提供することは困難ですが、C++ コードを変更して、標準入力から配列を繰り返し読み取り、結果を標準出力に書き込むことができます。

次に、Python サブプロセス モジュールを使用して、Python スクリプトから C++ プログラムを起動し、それと通信できます。

main()明らかに主な問題は、プログラムがそのデータ(あなたが言及したVCD)を読み取るために必要な時間であるため、C++プログラムの関数をループでラップするだけではあまり役に立ちません。

ループは、結果を計算するコードの周りに厳密に配置する必要があります。つまり、各実行が次の実行を汚染することなく、結果の計算を繰り返し実行できるように、他のすべてを因数分解する必要がある場合があります。

于 2011-01-28T10:31:29.490 に答える
1

さて、あなたの最善の行動は、おそらく、必要な計算を行う C++ コードを呼び出すことができる C/C++ 拡張機能を Python に記述することです。これはそれほど難しいことではなく、最小限の C/C++ コーディングだけで機能します。Python の拡張に関する適切な説明は、 http://docs.python.org/extending/extending.htmlの Python ページにあります。

実際に行うことは、C++ プログラムを、Python プロセスがリンクして Python スクリプトから呼び出すことができる動的ライブラリに変更することです。

それを機能させるために少し助けが必要な場合は、私たちがお手伝いできると確信しています。

于 2011-01-28T11:04:48.680 に答える
0

最善の方法は、Python 用の C++ 拡張モジュールをビルドすることだと思います。
それを行う方法はたくさんあります。
C++ ソースがある場合は、 SWIGを試す ことができます。その後、Python 内で直接 C++ 関数/オブジェクトを使用し、Python モジュール (ここでは処理) でそれらを管理できます。それは本当に簡単です。

于 2011-01-28T12:09:01.340 に答える
0

やり方が間違っていると思います

スクリプトが行うこと: C++ プログラム (私が作成したものではなく、c++ でうまくプログラミングできません): 7 つの数値配列を取り、単一の数値を返します。単純です。Python スクリプト (私のもので、Python で少しプログラミングできます): これらの 7 つの数値配列を生成し、それらを C++ プログラムにフィードし、回答を待ってリストに追加します。次に、次の配列を作成します。

あなたはこれを持っていますか?

python generate_arrays.py | someC++app | python gather_array.py

これにより、ボックス上のすべての CPU のすべてのコアを使用して、3 つの部分を並行して実行できます。OS は、3 つすべてが同時に実行されることを確認します。

それでも 100% の CPU 負荷が得られない場合は、次のようなことを行う必要があります。

( python generate_arrays.py --even | someC++app >oneFile ) & ( python generate_arrays.py --odd | someC++app > anotherFile )
python gather_array.py oneFile anotherFile

これにより、python generate_arrays.py の 2 つのコピーと、魔法の C++ プログラムの 2 つのコピーが実行されます。

コマンド ライン オプションを使用できるように、generate_arrays.py プログラムを書き直す必要があります。オプションが の場合、--even300 万個の配列が生成されます。オプションが の--odd場合、他の 300 万個の配列を生成します。

この (python | c++) & (python | c++) は、100% の CPU 使用率になるはずです。

于 2011-01-28T14:19:29.610 に答える