2009-12-01 12 views
11

NumPyやSciPyの一部はC/C++でプログラミングされていますか?NumPyとSciPyはどれくらいCにありますか?

PythonからCを呼び出すオーバーヘッドは、JavaやC#からCを呼び出すオーバーヘッドとどうやって比較できますか?

私はちょうどPythonがJavaやC#よりも科学的なアプリケーションの方が優れているのだろうかと思っています。

私がshootoutsを見ると、Pythonは大きなマージンを失います。しかし、私はこれらのベンチマークでサードパーティのライブラリを使用していないためだと思います。

+5

シュートアウトのPythonコード(例:http://shootout.alioth.debian.org/u32/benchmark.php?test=regexdna&lang=python&id=1)はnumpy/scipyを使用していません。 – unutbu

+2

Fortranについて忘れないでください。 PythonはFortranでもうまく動作します –

+0

@〜unutbuこれは、regex-dnaプログラムがnumpyを使うことを期待しているようなものです。 – igouy

答えて

11
  1. 各実装のソースが表示されないベンチマークについて質問したいと思いますか?これらのソリューションのいずれかまたは両方がひどくコード化されているため、いずれかまたは両方の言語のパフォーマンスが不公正に評価される可能性があります。[編集]おっと、ソースが表示されます。他の人が指摘しているように、NumPy/SciPyライブラリを使用していないので、それらのベンチマークはあなたが決定を下すのに役立たないでしょう。
  2. 私は、NumPyとSciPyの大半がC言語で書かれ、使いやすさのためにPythonでラップされていると思います。
  3. これはおそらく、特定のアプリケーションのオーバーヘッドがどれだけあるかによって、これらの言語の中で何をしているかによって異なります。

私は、数年前からデータ処理と解析にPythonを使用していましたので、それは確かに目的に合っていると思います。

あなたは終わりに何を達成しようとしていますか?読解可能なコードを速やかに開発したい場合、Pythonは優れた選択肢であり、あなたが解決しようとしているものは何でも最初の刺し傷に十分に速いでしょう。

問題の小さなサブセットでそれぞれにbashを使用して、開発時間と実行時間の点でベンチマークを行ってみませんか?それで、あなたはいくつかの関連するデータに基づいて客観的な決定を下すことができます。少なくともそれは私がやることです:-)

+0

ソースコードは次のとおりです特定のプログラムに移動することで利用できます。下にスクロールし、「Python CPython」リンクの1つをクリックします。例:http://shootout.alioth.debian.org/u32/benchmark.php?test=mandelbrot&lang=python&id=5 –

+1

+1。 NumPyのソースコードをダウンロードした後は、ほとんどがPythonでラップされたCであることが確認できます。 –

+0

"今のところ"それは優れた答えです。Python、Java、C#でCの相互運用性のコストを比較する人がいなければ、私はそれを受け入れます。また、私はあなたのアドバイスに従って、3つの言語すべてでアプリの一部を試作します。 –

5

多くはCまたはfortranで書かれています。あなたはホットループをC言語で書き直すことができます(または、巨大な方法を使ってPythonを高速化し、ブースト/ウィーブをお気に入りにしています)が、本当に問題になりますか?

あなたの科学アプリは一度実行されます。残りはちょうどデバッグと開発で、Python上ではもっと速くなります。

+1

本当に - あなたはそれを試してください:Python対話式コンソールからPython Numericを使用していくつかの行列を作成し、 "live"でいくつかのoperatinsを作ります。 - それは、他のツールでは卓越した使いやすさと柔軟性を提供します。新しいアイデアや使用パターンをすぐに試すことができるため、開発を中断します。 SciPyインタラクティブプロンプトは、MatLabや他の高価な(やや限定された)科学ツールの代替手段として使用されることがよくあります。 – jsbueno

+2

"あなたの科学的なアプリケーションは一度だけ実行され、残りはデバッグと開発に過ぎず、それらはPython上ではるかに速くなる可能性があります。 - 通常、私は同意します。しかし、このアプリは数日または数週間も実行できるので、処理時間をわずかに短縮することで、リアルタイムの処理時間を大幅に節約できます。それは複数回実行されます。 –

4

より良い比較here(ベンチマークではありませんが、Pythonを高速化する方法を示しています)。 NumPyは主にC言語で書かれています。Pythonの主な利点は、という非常に多くの方法があります。はC(ctypes、swig、f2py)/ C++(boost.python、weave.inline、weave。 blitz)/ Fortran(f2py) - またはPythonに型名を追加するだけでC(cython)に処理することができます。私は、C#やJavaのための比較的簡単なものはたくさんあるとは思わない - 少なくとも、さまざまな型の数値配列を渡すのは無意味なことだが(しかし、Pythonのパフォーマンス上のペナルティがないので議論するだろうと思うだろうがに)。

+1

リンクが壊れているようです。多分あなたはそれを置き換えることができますか? –

4

NumPyのほとんどはCですが、Cコードの大部分はPython/Cインターフェイスのすべての汚い詳細を処理するための "定型文"です。私はNumPyのC/Python比が約50/50 ATMだと思います。

私はvmベースの低レベルの詳細に慣れていませんが、jvmと.clrに課せられた制限のためにインターフェイスコストが高くなると思います。同様の環境よりnumpyが高速であることの理由の1つは、メモリー表現と、配列が関数間でどのように共有/渡されるかです。ほとんどの環境(MatlabとRも同様ですが)は、Copy-On-Writeを使用して関数間で配列を渡すのに対し、NumPyは参照を使用します。しかし、例えば、 JVMは(ポインタの使い方などの制限のために)難しいでしょう。それは実行可能です(JythonのためのNumPyの初期ポートがあります)が、私は彼らがこの問題をどのように解決するのか分かりません。たぶんC++/Cliはこれをもっと簡単にするでしょうが、私はその環境での経験はありません。

+0

@DavidCournapeaudは、C#からネイティブdllに配列を渡すのは、ポインタを渡すのと同じくらい簡単です。実際、配列のコピーは(Javaの場合のように)作成されません。配列_is_は非常に小さなオーバーヘッドで(ピンされた)参照として渡されました。 – user492238

0

言語は常にラングを処理する能力に依存しているため、言語は高速なコードを生成できます。私の経験から、numpyは.NET実装の数倍遅くなります。そして、私はJAVAが似たような速さを期待しています。最適化されたJITコンパイラは長年にわたって大幅に改善され、非常に効率的な命令を生成しています。

numpyは、スクリプト言語に対応している方には使いやすい構文が付属しています。しかし、アプリケーション開発について言えば、これらの利点は多くの場合障害になり、タイプセーフとエンタープライズのIDEが待ち望まれます。また、構文上のギャップはすでにC#で終わっています。 Java.NETの科学ライブラリがますます増えています。個人的には、多次元配列の構文がよく、もっと「近代的」な感じがするので、C#に向いています。もちろん、これは私の個人的な経験にすぎません。

関連する問題