25

Python コミュニティは、Python コードのプロファイリング方法や、C またはCythonでの Python 拡張機能の技術的な詳細を示す参考資料を公開しています。私はまだチュートリアルを探していますが、自明ではないPythonプログラムについては、次のことを示しています。

  1. C 拡張への変換による最適化の恩恵を受けるホットスポットを特定する方法
  2. 同様に重要なこととして、C 拡張への変換の恩恵を受けないホットスポットを特定する方法
  3. 最後に、Python から C への適切な変換を行う方法について説明します。Python C-API を使用するか、(できれば) Cython を使用します。

優れたチュートリアルでは、完全な例を使用して最適化の問題を解決する方法について、読者に方法論を提供します。そのようなリソースを見つけることに成功しませんでした。

そのようなチュートリアルを知っていますか (または書いたことがありますか) ?

明確にするために、以下のみをカバーするチュートリアルには興味がありません。

  • (c)Profile を使用して Python コードをプロファイリングし、実行時間を測定する
  • ツールを使用してプロファイルを調べる ( RunSnakeRunをお勧めします)
  • より適切なアルゴリズムまたは Python コンストラクトを選択することによる最適化 (たとえば、リストの代わりにメンバーシップ テストのセット)。チュートリアルでは、アルゴリズムと Python コードが既に最適化されていると想定する必要があり、C 拡張が次の論理的なステップになる時点に達しています。
  • C 拡張機能の作成に関する Python ドキュメントの要約。これは、リファレンスとしては優れていますが、Python から C にいつ、どのように移行するかを示すリソースとしては役に立ちません。
4

4 に答える 4

9

ポイント 1 と 2 は最適化の基本的な経験則です。あなたが探している種類のチュートリアルがどこかにあれば、私は非常に驚くでしょう. たぶんそれがあなたが見つけていない理由です。私の短いリスト:

  • 最適化のルール 1 は「しない」です。
  • ルール番号2の対策
  • ルール番号 3は、制限要因を特定します(それが IO またはデータベースにバインドされている場合、とにかく最適化に到達できない可能性があります)。
  • ルール番号4は、より良いアルゴリズムとデータ構造を使用することを考えてください ...
  • 言語の変更がリストのかなり低いことを考えると...

通常の Python ツールを使用して、Python コードのプロファイリングを開始するだけです。コードを最適化する必要がある場所を見つけます。次に、pythonに固執して最適化してみてください。それでも遅すぎる場合は、その理由を理解してください。IO バウンドの場合、C プログラムの方が優れているとは考えにくいです。問題がアルゴリズムに起因する場合、C のパフォーマンスが向上する可能性も低くなります。Cが役立つ「良い」ケースは非常にまれであり、ランタイムが必要なものから離れすぎないようにする必要があります(3倍の2倍のスピードアップのように)データ構造は単純で、低レベルの表現の恩恵を受けます。本当にそのスピードアップが必要です。他のほとんどの場合、python の代わりに C を使用することは報われない仕事になります。

実際、Python から C コードを呼び出すことが、パフォーマンスを第一の目標として念頭に置いて行われることはほとんどありません。多くの場合、目標は Python を既存の C コードとインターフェースさせることです。

また、別の投稿者が言ったように、cython を使用することをお勧めします。

それでも Python 用の C モジュールを書きたい場合は、必要なものはすべて公式ドキュメントにあります。

于 2010-11-15T22:50:43.347 に答える
6

O'Reilly には、実際のプロジェクトのプロファイリング (プロファイリングの対象として EDI 解析プロジェクトを使用) とホットスポットの特定方法を説明するチュートリアル (私が知る限り無料で入手でき、すべてを読むことができました) があります。O'Reilly の記事には、ボトルネックを修正する C 拡張機能の作成に関する詳細はあまりありません。ただし、重要な例を使用して、必要な最初の 2 つのことをカバーしています。

C 拡張機能を作成するプロセスは、ここにかなり詳しく文書化されています。難しいのは、Python コードが C で行っていることを再現する方法を考え出すことです。これには、チュートリアルでは教えるのが難しいような、創意工夫、アルゴリズム、ハードウェア、および効率に関する知識、そしてかなりの C スキルが必要です。

お役に立てれば。

于 2010-11-15T22:26:57.077 に答える
4

ポイント 1 と 2 については、cProfileなどの Python プロファイラーを使用します。簡単なチュートリアルについては、こちらを参照してください。

既存の python プログラムを持っている場合、ポイント 3 についてCythonの使用を検討することをお勧めします。もちろん、C で書き直すよりも、実行速度を上げるアルゴリズムの改善を考え出すことができるかもしれません。

于 2010-11-15T22:29:02.350 に答える
2

あなたのポイント 1 と 2、および最初の 3 つの箇条書きに対処しようと思いますが、順不同です。

3 番目の箇条書きには、「アルゴリズムと Python コードが既に最適であると仮定する」と書かれています。コードがその状態にある場合、スタック サンプルを取得すると (ここで概説されているように)、サンプルは時間の観点からプログラムが実行していることを正確に示しており、言語の変更なしに改善できるものは何もないように思われます。ただし、それがどのように時間を費やしているかを知っているので、どの低レベルのアルゴリズム (ホットスポットだけでなく、複数の関数で構成される可能性がある) が、時間を短縮することによって、つまり C に変換することによって利益を得ることができるかがわかります。 .

ポイント 1 に関して、このメソッドは、コードのどの部分が C への変換によって恩恵を受けるかを示しており、それらはホットスポットである場合とそうでない場合があります。(最初に頭に浮かぶのは、何らかの再帰関数または一連の関数です。または、ヒルクライマーなど、何らかの目的を一緒に達成する関数の小さなグループです。)

ポイント 2 に関しては、スタック サンプルの正常な割合に表示されないコード、または I/O など、C に変換することによって明らかにメリットがないコード。

箇条書きの 1 番目と 2 番目については、測定が主な目的ではなく、最適化するコードを見つけるプロセスの副産物であることに同意します。そのような測定値を提示することも重要ではありません。

PythonとCの間ではなく、Cとハードウェアの間を除いて、私は同様の状況にありました.**

例を挙げると、合計実行時間が 10 秒で、アルゴリズムが約 50% の時間スタック上にある場合、アルゴリズムは 10 秒のうち約 5 秒を担当します。アルゴリズムを C に変換すると 10 倍のスピードアップが得られる場合、その 5 秒は 0.5 秒に短縮されるため、全体の時間は 5.5 秒に短縮されます。(大まかに言えば、時間の短縮を達成することは、それがどのくらい大きくなるかを事前に知ることよりも重要です。) この時点で、プロセス全体を繰り返すことができ、他の何かを C に変換することも理にかなっている可能性があることに注意してください。Python コードが得意なことを実行しており、C コードが得意なことを実行していることをサンプルが示している場合は、このプロセスを停止できます。

** 例: 浮動小数点演算、ライブラリ対チップ、またはグラフィックス、テキストとポリゴンの描画。

于 2010-11-16T16:57:02.123 に答える