2012-04-27 10 views
0

Python用のバイナリモジュールを作成する方法はたくさんありますので、私はあなたの経験を活かしてアドバイスを得ることができました。可能な限りコードを作成してください。pythonを拡張する最善の方法/ numpy performancewise

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

当然ながら、Cythonのようなツールが最も簡単に使えますが、手作業でコードを書くとより良いコントロールが得られ、より良いパフォーマンスが得られると思います。

質問、それは一般にあってもよいが、使用するアプローチです。 CまたはC++の拡張機能を記述しますか?外部C/C++関数をラップするか、またはコールバックを使用してPython関数を使用しますか?

私はPythonとC.

+2

よく書かれたCythonは、Cエクステンションを手作業で書くよりも、Cコードに近い性能を* much *少ないコードで与えるべきです。 –

答えて

3

間のインタフェースには、いくつかの方法の比較があり、私はそれはあなたのスキル/経験に依存だと思いLangtangenの「計算科学のためのPythonスクリプト」の章10を読んだ後にこの質問を書きますあなたのプロジェクト。 これは非常にponctualであり、あなたがC/C++でprofficientされている、あなたはすでに、独自の拡張機能を作成し、それをインターフェースそして、Pythonラッパーを書いた場合。

もし他のプロジェクトでNumpyと仕事をしているなら、Numpy C-APIに行きましょう。それは広範でかなり文書化されていますが、処理するのにはかなりの文書です。 少なくとも私はそれを処理するのが難しかったですが、もう一度私はCで吸います。

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

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

1

いくつかの異なるアプローチの良い比較は、hereで見つけることができます。私は両方の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に基づいています。

関連する問題