1

計算用のデータを含むいくつかの大きなmysqlデータベースと、外部のWebサイトからデータを取得する必要がある部分があります。

私はこれまでPythonを使用してすべてを実行していましたが、何と言えばいいのでしょうか。スピードスターではありません。

今、私はBoost::PythonとPythonCAPIを使用してPythonとC++を混合することを考えています。

私が今持っている質問は、スピードを上げるためのより良い方法は何であるかということです。PythonをいくつかのC++コードで拡張しますか、それともPythonコードをC ++プログラムに埋め込みますか?

計算部分にc++コードを使用すると、ある程度の速度の向上が確実に得られます。Pythonインタープリターは常に実行されるため、Cアプリケーション内でPythonインタープリターを呼び出すことは適切ではないと思います。そして、c ++内で動作するための優れた方法を得るには、mysqldbやurllib3などのpythonライブラリをラップする必要があります。

では、拡張または埋め込みという、より良い方法は何を提案しますか?(私はPython言語が大好きですが、C ++にも精通しており、速度を尊重しています)

更新:そこで、いくつかの部分をpythonからc ++に切り替え、cモジュールでマルチスレッド(実際のスレッド)を使用しました。プログラムでは、7時間30分ではなく必要になります:))))

4

2 に答える 2

4

原則として、私は最初の2つの答えに同意します。ディスクから、またはネットワーク接続を介して発生するものはすべて、アプリケーションよりも大きなボトルネックになる可能性があります。

過去50年間のすべての調査は、人々がシステムパフォーマンスの問題について不正確な直感を持っていることが多いことを示しています。したがって、私見では、実際に何が起こっているかを測定することによって、実際にいくつかの証拠を収集し、その証拠に基づいて解決策を選択する必要があります。

パフォーマンスの低下の原因を確認するには、アプリケーションのシステムとユーザーの時間を測定し(たとえばtime python prog.py)、マシンの負荷を測定します。

アプリケーションがCPUを最大限に活用していて、その時間のほとんどがアプリケーションに費やされている場合(ユーザー時間)、アプリケーションにより効果的なテクノロジーを使用する場合があります。

ただし、CPUが最大化されていない場合、またはアプリケーションがほとんどの時間をシステム(システム時間)に費やし、アプリケーション(ユーザー時間)に費やしていない場合、アプリケーションプログラミングテクノロジの変更が大幅に役立つとは考えられません。(これはアムダールの法則の例ですhttp://en.wikipedia.org/wiki/Amdahl%27s_law

ボトルネックの原因を特定するために、データベースサーバーのパフォーマンス、場合によってはネットワーク接続を測定する必要がある場合もありますが、最も簡単な部分から始めます。

于 2012-03-17T02:16:18.053 に答える
2

私の意見では、あなたの場合、PythonをC ++に埋め込むことは意味がありませんが、その逆が有益である可能性があります。

ほとんどのプログラムでは、パフォーマンスの問題は非常にローカライズされています。つまり、問題のあるコードは、問題のあるコードを意味のある場所でのみ書き直し、残りはPythonのままにする必要があります。

これにより、必要な場所でのC ++の速度、使いやすさ、その他の場所でのPythonの柔軟性という、両方の長所が得られます。また、このプロセスを段階的に実行し、スローコードパスをbyに置き換えて、アプリケーション全体を常に使用可能な(そしてテスト可能な)状態に保つことができるのも素晴らしいことです。

逆は意味がありません。Python構造の柔軟性を犠牲にして、ほとんどすべてのコードを書き直す必要があります。

それでも、パフォーマンスについて話すときはいつものように、対策を講じる前にボトルネックがCPU /メモリにバインドされていない場合、C++への切り替えは多くの利点を生み出す可能性はありません。

于 2012-03-17T02:02:58.843 に答える