25

ゲームプロジェクト用にCで記述された関数がいくつかあります。これらの関数は非常に頻繁に呼び出されます(1秒間に約2000〜4000回)。関数は生の速度のためにCで書かれています。

さて、これらの関数をPythonに含める最も簡単な方法は、を使用することctypesです。別の方法は、これらの関数の周りにPythonのC拡張機能を作成することです(これにはかなりの余分な労力がかかります)。それで、DLLの初期ロードを除いて、オーバーヘッドはどれくらい大きいのだろうかと思いましたctypes


Python 2.7(標準のCPythonリリース)を使用していますが、Cythonのような外部ライブラリを使用したくありません。

この質問は以前に行われたことがありますが、2つのオプションのパフォーマンスの比較に関する情報はあまり見ていません。

4

2 に答える 2

18

C拡張機能とctypesラッパーのパフォーマンスを比較しました。私の特定のテストでは、違いは約250倍でした。Cライブラリへの呼び出しが複数あったため、ctypesラッパーもPythonコードを実行していました。Cライブラリの実行時間は非常に短かったため、Pythonコードの余分なオーバーヘッドがさらに大きくなりました。したがって、比率はおそらくあなたにとっては異なるでしょうが、私の場合は重要でした。

于 2011-11-09T17:42:08.210 に答える
9

直接Cコード化されたインターフェースは、はるかに高速になる可能性があります。ボトルネックはPythonからCへのインターフェースであり、引数と結果のマーシャリングには、たとえば、文字列のコピーやPythonリストのC配列との変換が含まれる場合があります。これらの呼び出しを数百回行うループがあり、呼び出しごとにデータの一部を個別にマーシャリングする必要がない場合は、ループをCで再コーディングするだけで、ボトルネックを大幅に減らすことができる場合があります。 。ctypesにはそのオプションはありません。実行できるのは、既存の関数を直接呼び出すことだけです。

もちろん、それはすべて、呼び出している関数の種類と受け渡ししているデータの種類に正確に依存します。オーバーヘッドを減らすことができない可能性があります。その場合でも、ctypesは遅くなると思いますが、それほど大きくはないでしょう。

最善の方法は、それぞれの方法で記述されたコードのサンプルをまとめてベンチマークすることです。そうでなければ、決定的な答えを得るには変数が多すぎます。

于 2011-11-09T15:36:38.463 に答える