0

Python用のバイナリモジュールを作成する方法は多数あるので、コードの一部のセグメントのパフォーマンスを可能な限り向上させたい場合は、経験のある人が最善のアプローチについてアドバイスできることを期待していました。

私が理解しているように、python / numpy C-apiを使用して拡張機能を作成するか、Pythonコードから呼び出されるようにすでに作成された純粋なC / C ++/Fortran関数をラップすることができます。

当然、Cythonのようなツールが最も簡単な方法ですが、コードを手動で作成すると、制御が向上し、パフォーマンスが向上すると思います。

問題は、一般的には、どのアプローチを使用するかです。CまたはC++拡張機能を作成しますか?外部C/C ++関数をラップするか、Python関数へのコールバックを使用しますか?

この質問は、Langtangenの「計算科学のためのPythonスクリプティング」の第10章を読んだ後に書いています。ここでは、PythonとCの間でインターフェースをとるいくつかの方法が比較されています。

4

2 に答える 2

3

それはあなたのスキル/経験とあなたのプロジェクトに依存すると思います。これが非常に偶然であり、C / C ++に習熟していて、Pythonラッパーを既に作成している場合は、独自の拡張機能を作成してインターフェイスします。

他のプロジェクトでNumpyを使用する場合は、Numpy C-APIを使用してください。これは広範囲にわたっており、十分に文書化されていますが、処理する文書もかなり多くなっています。少なくとも私はそれを処理するのに多くの困難を抱えていました、しかしそれから私は再びCを吸います。

Cythonに行くかどうか本当にわからない場合は、はるかに時間がかからず、ほとんどの場合、パフォーマンスは非常に良好です。(私の選択)私の観点からは、以前の2つの実装でCythonよりも優れたパフォーマンスを発揮するには、優れたCコーダーである必要があり、はるかに複雑で時間がかかります。それで、あなたは素晴らしいCコーダーですか?

もちろん、ハードウェアにもよりますが、パフォーマンスを求めている場合は、pycudaやその他のGPGPUを調べる価値があるかもしれません。

于 2012-04-27T14:17:00.397 に答える
1

いくつかの異なるアプローチの良い比較はここにあります。私はcythonと、f2pyを使用して自分のFortranコードをラップすることの両方を試しました。私は、f2pyが私の目的のために行くためのより良い方法であることに気づきました。これは、私がFortranを理解しているという事実に部分的に影響されましたが、正直なところ、Fortran 90などの最新の方言は、numpyを使用するPythonコードにかなり似ており、理解するのはそれほど難しいことではありません。

cythonでは、低速で純粋なpythonコードから始めます。次に、コードをインストルメント化し、python APIへのすべての呼び出しがどこにあるかを見つけ、適切な場所に関連するcythonキーワードを入力するという面倒なプロセスを実行する必要があります。より高速なCコードに変換します。fortranを使用すると、通常のコードを記述するだけで、面倒な反復プロセスを実行することなく、コンパイルされた速度をすでに完全に得ることができます。

さらに、cythonでの特定の配列操作では、Python APIの呼び出しが遅くなります。特に、スライス操作に関係する操作はそうです。対照的に、Fortranの配列は、コンパイラーが理解して最適化できるネイティブ型です。そうは言っても、cythonはかなり急速に進歩しているので、これは将来変更される可能性があります。

私がf2pyで見つけた最大の欠点は、派生型の配列をサポートしていないことです(numpyの再配列に類似しています)。fwrapがこの問題を解決するf2pyの代わりになるという希望がありましたが、現時点ではバックバーナーにあるようです。ちなみにそれはcythonに基づいています。

于 2012-05-02T08:01:21.730 に答える