46

十分な速度で実行されないことが判明した Python のコードを持っている人はいますか?

つまり、そのために別の言語を選択することを余儀なくされたということですか?

いくつかの大規模なプロジェクトで Python の使用を調査していますが、ほとんどの場合、Python は最適化された C ルーチンに依存しているため、(たとえば Java と比較して) ほとんどのシナリオで十分に高速であると感じています。

私は、Python で始めたものの、パフォーマンスのために別のものを使わなければならなくなっという例があるかどうかを確認したかったのです。

ありがとう。

4

19 に答える 19

34

はい、あります。バイナリ(区切りではなく長さのプレフィックス)bcp出力ファイルの行カウントプログラムを一度作成しましたが、Pythonのプログラムが遅すぎたため、Cでやり直す必要がありました。このプログラムは非常に小さかった (C で書き直すのに数日しかかからなかった) ので、わざわざハイブリッド アプリケーション (C で書かれた中央ルーチンを備えた Python グルー) を構築しようとはしませんでしたが、これには実行可能なルートでした。

パフォーマンスが重要なビットを含む大規模なアプリケーションは、C と高水準言語の組み合わせで作成できます。システムの残りの部分については、Python へのインターフェイスを使用して、パフォーマンスが重要な部分を C で記述できます。 SWIGPyrex、またはBoost.Python (C++ を使用している場合) はすべて、Python インターフェイスの配管を行うための優れたメカニズムを提供します。PythonのC API はTclLuaの C APIよりも複雑ですが、手動でビルドするのは不可能ではありません。手作りの Python/C API の例については、cx_Oracleを確認してください。

このアプローチは、1970 年代にまでさかのぼる (私が知っている) かなりの数の成功したアプリケーションで使用されてきました。 Mozillaは、C で書かれたコア エンジンを中心に Javascript で実質的に書かれてい ます。いくつかの CAD パッケージInterleaf (技術文書発行システム)、そしてもちろんEMACSは、中心的な C、アセンブリ言語、またはその他のコアを持つ LISP で実質的に書かれています。かなりの数の商用およびオープンソース アプリケーション ( ChandlerSungard Front Arenaなど) は、組み込みの Python インタープリターを使用し、アプリケーションのかなりの部分を Python で実装しています。

編集: Dutch Masters のコメントに応えて、Python プロジェクトのチームに C または C++ プログラミング スキルを持つ人を配置すると、速度を上げるためにアプリケーションの一部を作成するオプションが与えられます。大幅なパフォーマンスの向上が期待できる領域は、アプリケーションが大規模なデータ構造または大量のデータに対して非常に反復的な処理を行う場合です。上記の行カウンターの場合、合計数ギガバイトの一連のファイルを吸い込み、可変長のプレフィックスを読み取り、それを使用してデータ フィールドの長さを決定するプロセスを実行する必要がありました。ほとんどのフィールドは短かった (わずか数バイト)。これは少しおかしくて非常に低レベルで反復的であったため、C に自然に適合しました。

numpycElementTree、またはcStringIOなどの Python ライブラリの多くは、最適化された C または FORTRAN コアを使用し、集約されたデータの操作を容易にする Python API を使用します。たとえば、numpy には C で記述された行列データ構造と操作があり、これらがすべてのハードワークを行い、集約レベルでサービスを提供する Python API を備えています。

于 2008-12-22T16:28:08.517 に答える
19

これは、人々が認めようとするよりも、答えるのがはるかに難しい質問です。

たとえば、C よりも Python の方が優れたパフォーマンスを発揮するプログラムを作成できる可能性があります。そのステートメントからの間違った結論は、「したがって、Python は C よりも高速です」です。実際には、Python とそのベスト プラクティス、および標準ライブラリの経験が最近のほうが多いためかもしれません。

実際、両方の言語で最適なソリューションを作成できると確信していない限り、誰もあなたの質問に答えることができません。つまり、「私の C のソリューションは Python のソリューションよりも速かった」と「C は Python のソリューションよりも速い」とは異なります。

私は、Guido Van Rossum が adam と Dustin の問題に対して非常にうまく機能する Python ソリューションを作成できたと確信しています。

私の経験則では、クロック サイクルをカウントする必要のある種類のアプリケーションを作成していない限り、Python で許容できるパフォーマンスを達成できる可能性があります。

于 2008-12-22T16:40:55.917 に答える
15

レコードに 0.02 ドルを追加します。

私の仕事には、数百ギガバイトを超えるデータを実行する数値モデルの開発が含まれます。困難な問題は、収益を生み出すソリューションを迅速に考え出すことです (つまり、市場投入までの時間)。商業的に成功するには、ソリューションを迅速に実行する必要もあります(ソリューションを最小限の時間で計算する)。

私たちにとって、Python は、開発時間の短縮、言語の表現力、豊富なライブラリなど、一般的に挙げられる理由から、ソリューションを開発するための優れた選択肢であることが証明されています。すでに述べました。

  1. 計算量の多い部分には numpy を使用します。numpy を使用した「ネイティブ」C++ ソリューションの 1.1 倍から 2.5 倍の速度で、コードが少なく、バグが少なく、開発時間が短縮されます。
  2. 再計算を最小限に抑えるための中間結果の酸洗 (Python のオブジェクトのシリアル化)。私たちのシステムの性質上、同じデータに対して複数のステップが必要になるため、結果を「記憶」し、可能な場合は再利用します。
  3. プロファイリングとより良いアルゴリズムの選択。他の回答でも言われていますが、繰り返します。cProfile を削除し、ホットスポットをより良いアルゴリズムに置き換えようとしています。すべての場合に当てはまるわけではありません。
  4. C++ に移行します。上記が失敗した場合、C++ ライブラリを呼び出します。PyBindGenを使用して Python/C++ ラッパーを記述します。中間層なしで直接 Python C API コードを生成するため、SWIG、SIP、および Boost.Python よりもはるかに優れていることがわかりました。

このリストを読んでいると、「何と多くのやり直しが必要なのだろう! [C/C++/Java/アセンブラー] で最初からやり直して、それで終わりだ」と思うかもしれません。

視野に入れてみましょう。Python を使用して、5 週間で収益を生み出す実用的なアプリケーションを作成することができました。これは、他の言語では、以前は同様の範囲のプロジェクトに 3 か月かかっていました。これには、遅いことがわかった Python 部分を最適化するために必要な時間が含まれます。

于 2009-01-26T04:54:13.443 に答える
7

大学では、ビデオ クリップに基づいて人間の行動を分析するためのコンピューター ビジョン システムを作成していました。開発をスピードアップし、配列などに変換するためにビデオから抽出した画像フレームに簡単にアクセスできるようにするために、優れた PIL のために Python を使用しました。

私たちが望んでいたものの 90% については問題なく、画像の解像度がかなり低かったため、速度も悪くありませんでした。ただし、一部のプロセスでは、複雑なピクセル単位の計算と、非常に遅い畳み込みが必要でした。これらの特定の領域について、ループの最も内側の部分を C で書き直し、古い Python 関数を更新して C 関数を呼び出すようにしました。

これにより、両方の長所が得られました。Python が提供するデータ アクセスの容易さにより、高速な開発が可能になり、最も集中的な計算では C の直線的な速度が得られました。

于 2008-12-22T17:12:50.267 に答える
7

遠くはありません。私は、分子シミュレーション エンジンと、大規模な数ギガバイトのデータセットを処理するための Python で書かれた一連のプログラムを持っている会社で働いています。開発の柔軟性と時間の点で大きな利点があるため、分析ソフトウェアはすべて Python で記述されています。

何かが十分に高速でない場合は、cProfile を使用してプロファイリングし、ボトルネックを見つけます。通常、ランタイムの 80 または 90% を占める 1 つまたは 2 つの関数があります。次に、これらの関数を C で書き直します。これは、Python が C API を使用して非常に簡単にするものです。多くの場合、これにより 1 桁以上の速度が向上します。問題はなくなりました。それから、他のすべてを Python で書き続けます。洗い流して繰り返し…

モジュール全体またはクラス全体では、Boost.python を使用する傾向があります。これは少し負担になる可能性がありますが、最終的にはうまく機能します。プロジェクトがすでに scipy を使用している場合、関数が 1 つまたは 2 つだけの場合は、scipy.weave でインライン化することがあります。

于 2008-12-22T18:41:19.683 に答える
5

Python のボトルネックを見つけるたびに、そのコードを C で Python モジュールとして書き直します。

たとえば、画像ピクセルを 4 バイトの 0RGB として送信するハードウェアがあります。Python で 8M を 0RGB から RGB に変換するには時間がかかりすぎるので、Python モジュールとして書き直しました。

Python (またはその他の高水準言語) を作成することは、C で作成するよりもはるかに高速であるため、できなくなるまで Python を使用します。

于 2008-12-22T18:03:54.983 に答える
4

この種の質問は、言語の人々の間で宗教戦争を開始する可能性が高いので、少し違った答えをさせてください.

今日のコンピューティング環境のほとんどの場合、プログラミング言語の選択は、言語のパフォーマンス特性ではなく、効率的にプログラミングできるもの、適切にプログラミングできるもの、満足できるものに基づいて選択する必要があります。また、システムをプログラミングするときは、通常、最適化は最後の懸念事項です。

python で行う典型的な方法は、python でプログラムを書き始めることです。次に、パフォーマンスが低下していることに気づいたら、アプリケーションのプロファイルを作成し、最初に python でホットスポットを最適化しようとします。Python コードの最適化がまだ十分でない場合は、重荷になっているコードの領域を C で Python モジュールとして書き直す必要があります。それでもなお、プログラムが十分に高速でない場合は、次のいずれかを変更できます。または、ハードウェアまたは同時実行性のスケールアップを検討してください。

あなたの質問に直接答えるには、それが長い答えです。いいえ、python (C 拡張機能を使用する場合もあります) は、私が必要とするすべてのことに対して十分に高速です。私が実際に C に没頭するのは、Python バインディングを持たないものにアクセスするときだけです。

編集: 私のバックグラウンドは、大規模な .com の Python プログラマーであり、Web サイトのフロントエンドからすべてのバックオフィス システムに至るまで、すべてに Python を使用しています。Python は非常にエンタープライズ レベルの言語です。

于 2008-12-24T03:55:24.447 に答える
4

特定のデータ型に特化した memcache サーバーを実装すると、ストレージ バックエンドのメモリ効率が向上し、ビット単位のルックアップ操作 (つまり、O(1) ルックアップ) によってルックアップ時間が短縮される可能性があります。

私は 2 日以内にすべてのプロトコル実装とイベント ドリブン デーモン部分を Python で作成しました。チームがプロトコルの適合性やその他の部分を検証している間、機能をテストし、パフォーマンスに集中するのに十分な時間を与えてくれました。

Pyrexのようなツールがあれば、Python に C 拡張機能を実装することは、C の経験が少しある開発者にとっては簡単なことです。基数ツリーベースのストレージ バックエンドを C で書き直して、1 日で Pyrex を使用した Python モジュールにしました。475K プレフィックスのメモリ使用量が 90MB から 8MB に減少しました。クエリのパフォーマンスが 1200% 向上しました。

現在、このアプリケーションはpyevent (libevent 用の Python インターフェース)で実行されており、新しいストレージ バックエンドは、40MB 未満のメモリを消費する (libevent のおかげで)シングル プロセス デーモン として実行されている、控えめなシングル コア サーバーで 1 秒あたり 8000 クエリを処理します( 300 以上の同時接続を処理しながらPython インタープリター) 。

これは、5 日以内に製品品質を実現するために設計および実装されたプロジェクトです。Python と Pyrex がなければ、もっと時間がかかります。

より強力なサーバーを使用してマルチプロセス/マルチインスタンス モデルに切り替えるだけで、パフォーマンスの問題をトラブルシューティングすることができましたが、コードと管理タスクが複雑になり、メモリ フットプリントがはるかに大きくなりました。

あなたは Python を使って正しい方向に進んでいると思います。

于 2009-03-23T15:12:34.750 に答える
2

私はしばらくの間、大きな構造化データを操作するアプリケーションを開発してきました。これは、数ギガバイトの厚さのデータベースに格納されており、Pythonで十分です。このアプリケーションには、多数のコントロール(リスト、ツリー、ノートブック、仮想リストなど)を備えたGUIクライアントと、コンソールサーバーがあります。

パフォーマンスの問題がいくつかありましたが、それらは主に、Python自体よりも、不十分なアルゴリズム設計またはデータベースエンジンの制限(Oracle、MS-SQL、MySQLを使用し、速度の最適化に使用されるBerkeleyDBとのロマンスが短かった)に関連していました。標準ライブラリ(Cで記述)を適切に使用する方法を理解したら、コードを非常に迅速に作成できます。

他の人が言うように、計算集約型のアルゴリズム、ビットスタッフィングに依存するコード、メモリに制約のある計算は、CPU /メモリの節約(またはその他のトリック)のために生のC / C ++で実行できますが、ユーザーの操作、ロギング、データベース処理、エラー処理-アプリケーションを実際に実行するためのすべてをPythonで記述でき、応答性と適切な全体的なパフォーマンスを維持します。

于 2008-12-22T17:05:58.563 に答える
2

ログ処理などを行うために、Python で多くのプロトタイプを作成していました。それらが十分に速く実行されなかったとき、私はそれらを ocaml で書き直しました。

多くの場合、python は問題なく動作し、満足していました。場合によっては、1 日分のログを作成するのに 23 時間近くかかり始めたので、書き直さなければなりませんでした。:)

そのような場合でも、Python コードをプロファイリングして、より適切な Python 実装を見つけたほうがよかったかもしれないことを指摘したいと思います。

于 2008-12-22T16:34:44.023 に答える
2

アプリケーションの一部はいつでも Python で記述できます。すべてのコンポーネントがパフォーマンスにとって等しく重要であるとは限りません。Python は、C++ とネイティブに統合したり、Jython を介して Java と統合したり、IronPython を介して .NET と統合したりできます。

ちなみに、一部のベンチマークでは、IronPython は Python の C 実装よりも効率的です。

于 2008-12-22T16:42:26.397 に答える
2

はい、2 回:

  • Python では適切なパフォーマンスが得られなかったため、C++ で完全に書き直すことになったオーディオ DSP アプリケーション。Python の実装が無駄になったとは考えていません。なぜなら、概念のプロトタイプを非常に簡単に作成できるからです。C++ への移植は、機能する参照実装があったためスムーズに進みました。

  • Python で大規模な 2D テクスチャ マップを生成するのに時間がかかっていた手続き型グラフィック レンダリング プロジェクト。C++ DLL を作成し、ctypes/windll を使用して Python から使用しました。

于 2010-06-25T23:55:49.173 に答える
2

私は数年前からPythonで開発しています。最近、ディレクトリ内のすべてのファイルを一覧表示し、ファイル名、サイズ、属性、および変更日を含む構造体を構築する必要がありました。と でこれをos.listdir行いos.statました。コードは非常に高速でしたが、ディレクトリ内のエントリが多いほど、同じディレクトリをリストする他のファイルマネージャーと比較してコードが遅くなったため、SWIG/C++ を使用してコードを書き直し、コードがどれほど高速であるかに本当に驚きました。

于 2009-02-02T00:56:30.433 に答える
1

1か月前、ログを分析するこの小さなプログラムをPythonで(仕事用に)作成しました。その後、ログファイルの数が増えると、プログラムが非常に遅くなり始め、Javaで書き直すことができると思いました。

とても面白かったです。同じアルゴリズムをPythonからJavaに移行するのに丸一日かかりました。一日の終わりに、いくつかのベンチマークトライアルは、JavaプログラムがPythonの対応するプログラムよりも約20%/ 25%遅いことを明確に示しました。驚きました。

アルゴリズムを2回書くと、最適化が可能であることがわかりました。したがって、2時間ですべてをPythonで完全に書き直し、元のPython実装よりも約40%高速でした(したがって、私が持っていたJavaバージョンよりも数桁高速でした)。

それで:

  1. Pythonは遅い言語ですが、それでも、特定のタスクでは、他のおそらくより速い言語よりも速くなる可能性があります

  2. 実行は速いが開発時間が遅い言語(ほとんどの言語)で何かを書くことに時間を費やす必要がある場合は、同じ時間を使用して問題を分析し、ライブラリを検索し、プロファイルを作成してから、より適切なPythonコードを作成することを検討してください。

于 2008-12-25T20:57:40.577 に答える
1

私はかつて、シミュレーター用の疑似乱数ジェネレーターを作成する必要がありました。私は最初にPythonでそれを書きましたが、Pythonは遅すぎることがわかりました。私はそれをCで書き直すことになり、それでも遅いですが、Pythonほど遅くはありませんでした。

幸い、PythonとCのブリッジはかなり簡単なので、PRNGをCモジュールとして記述し、残りのシミュレーターをPythonで記述することができました。

于 2008-12-25T21:29:04.570 に答える
1

いいえ、書き直す必要はありませんでした。実際、私は Maya 8.5 で Python を使い始めました。Maya 8 より前は、使用可能な唯一のスクリプト言語は組み込みの MEL (Maya Expression Language) でした。実際、Python はそれがラップする組み込み言語よりも高速です。

また、MEL は 1 次元配列しか格納できない (ポインターを格納できない) ため、複雑なデータ型を処理する Python の機能により高速化されました。これには、複数の並列配列を使用するか、低速の文字列連結を使用して、多次元配列を偽造する必要があります。

于 2008-12-23T02:14:06.447 に答える
1

次のリンクは、多数のコンピューター言語間の進行中の比較を提供します。さまざまな問題領域にわたる Python の長所と短所のいくつかを理解できるはずです。

コンピューター言語ベンチマーク ゲーム

于 2008-12-29T07:56:05.330 に答える
1

Perl プログラムOpenKoreを Python で Erok (元の Kore の逆) という名前で書き直そとしています。これまでのところ、Python は全体的に優れた言語であることが証明されています。特に、正規表現の使用を必要としない強力な文字列解析関数により、多くのファイル解析が高速化されています。

于 2008-12-29T08:07:11.890 に答える
0

私は通常、私がする前にCに書き直しません:

  • プロフィール
  • ベットアルゴリズムで書き直します(通常はこれで十分です)
  • 低レベルのパフォーマンスを念頭に置いてPythonコードを書き直します(ただし、Python以外の/読み取り不可能なコードになることはありません)
  • ライブラリの再チェックに時間を費やすと、これを実行できません(最初にstdlibまたは外部ライブラリで)
  • psyco /他の実装を試しました(私の場合、実際の速度向上を達成することはめったにありません)

次に、重い行列計算コード(numarrayでは実行できませんでした)を実行するための共有ライブラリを作成し、ctypesで呼び出しました。

  • 純粋なCで.so/dllを作成/構築/テストするのは簡単です。
  • CからPythonへの関数をカプセル化するのは簡単です(つまり、ctypesは正しい引数を呼び出すすべての作業を行うため、基本的なデータ型を使用する場合はカプセル化しません)。
于 2009-12-14T10:09:46.097 に答える