私は Hadoop を使用するプロジェクトに取り組んでおり、Java をネイティブに組み込み、Python のストリーミング サポートを提供しているようです。どちらかを選択すると、パフォーマンスに重大な影響がありますか? いずれかの方法でパフォーマンスに大きな違いがある場合は、どちらの方法でもよいプロセスの初期段階にあります。
3 に答える
Pythonを使用すると、おそらく開発が速くなり、Javaを使用すると確実に高速に実行されます。
すべての人気のある言語間の非常に正確な速度比較を見たい場合は、Googleの「benchmarksgame」ですが、正しく思い出せば、3〜5倍速く話していることになります。
とは言うものの、最近はプロセッサに縛られているものはほとんどないので、Pythonでより良く開発したいと思うなら、ぜひ試してみてください。
コメントへの返信(JavaはPythonよりもどのように高速であるか):
すべての言語は異なる方法で処理されます。Javaは、CおよびC ++の次にほぼ高速です(Javaよりも高速または最大5倍高速ですが、平均して約2倍高速のようです)。残りは2-5倍以上遅くなります。Pythonは、Javaに次ぐ高速なPythonの1つです。C#はJavaとほぼ同じか、おそらくもっと速いと思いますが、ベンチマークゲームはWindowsで実行されないため、Mono(少し遅い)しかありませんでした。
これらの主張のほとんどは、各言語の支持者/専門家が特定の言語で書かれたテストを微調整してコードが適切にターゲットにされていることを確認するため、かなり公平になる傾向があるコンピューター言語ベンチマークゲームに基づいています。
たとえば、これはJavaとc ++を使用したすべてのテストを示しており、Javaとほぼ同じ速度範囲が3倍遅く(最初の列は1〜3)、Javaははるかに多くのメモリを使用していることがわかります。
このページでは、JavaとPythonを比較しています(Pythonの観点から)。したがって、速度はJavaより2倍遅いPythonから174倍遅いまでの範囲ですが、Pythonは通常、コードサイズとメモリ使用量でJavaよりも優れています。
ここでのもう1つの興味深い点は、大量のメモリを割り当てたテストです。実際、Javaは、メモリサイズにおいてもPythonよりも大幅に優れたパフォーマンスを発揮しました。通常、JavaはVMのオーバーヘッドのためにメモリを失うと確信していますが、それを考慮に入れると、Javaはおそらくほとんどの場合よりも効率的です(Cを除く)。
ちなみに、これはPython 3ですが、テストされた他のPythonプラットフォーム(Pythonと呼ばれるだけです)ははるかに悪い結果になりました。
それがどのように高速であるかを本当に知りたいのであれば、VMは驚くほどインテリジェントです。コードの実行後に機械語にコンパイルされるため、最も可能性の高いコードパスが何であるかがわかり、それらに最適化されます。メモリ割り当ては芸術であり、オブジェクト指向言語で本当に役立ちます。非VM言語では実行できない驚くべき実行時の最適化を実行できます。強制すると、かなり小さなメモリフットプリントで実行でき、C /C++とともに組み込みデバイスに最適な言語です。
私はAgilent用のSignalAnalyzer(高価なo-scopeを考えてください)に取り組みました。そこでは、(サンプリングを除いて)ほぼすべてがJavaで行われました。これには、トレース(AWT)を含む画面の描画、およびコントロールとの対話が含まれます。
現在、私は将来のすべてのケーブルボックスのプロジェクトに取り組んでいます。ガイドは他のほとんどのアプリと一緒にJavaで書かれます。
なぜPythonよりも高速ではないのですか?
Java は Python ほど動的ではなく、その VM により多くの労力が費やされているため、より高速な言語になっています。また、Python はグローバル インタープリター ロックによって抑制されています。つまり、単一プロセスのスレッドを別のコアにプッシュすることはできません。
これが大きな違いを生むかどうかは、何をしようとしているのかによって異なります。両方の言語がうまくいくと思います。
Hadoop mapreduce変換は、「ストリーミング」または「カスタムjar」として記述できます。ストリーミングを使用する場合は、PythonやC ++など、任意の言語でコードを記述できます。コードはSTDINから読み取られ、STDOUTに出力されます。ただし、0.21より前のバージョンのHadoopでは、Hadoopストリーミングは、バイナリではなくテキストのみをプロセスにストリーミングするために使用されていました。したがって、ファンキーなエンコーディング変換を自分で行わない限り、ファイルはテキストファイルである必要がありました。しかし、Hadoopストリーミングでバイナリ形式を使用できるようにするパッチが追加されたようです。
「カスタムjar」を使用する場合(つまり、hadoopライブラリを使用してJavaまたはScalaでmapreduceコードを記述した場合)、ストリーミングプロセスからバイナリ(バイナリでシリアル化)を入力および出力できる関数にアクセスできます(結果をディスクに保存します)。したがって、将来の実行ははるかに高速になります(バイナリ形式がテキスト形式よりどれだけ小さいかによって異なります)。
したがって、HadoopジョブがI / Oバウンドになる場合は、「カスタムjar」アプローチが高速になります(以前のポスターが示したように両方のJavaが高速であり、ディスクからの読み取りも高速になるため)。
しかし、あなたは自分の時間がどれほど価値があるかを自問しなければなりません。私はPythonの方がはるかに生産的であり、STDINを読み取ってSTDOUTに書き込むmap-reduceを書くのは本当に簡単です。ですから、私は個人的にPythonルートを使用することをお勧めします-バイナリエンコーディングを自分で理解する必要がある場合でも。hadoop 0.21は非utf8バイト配列を処理し、Pythonに使用する代替のバイナリ(バイト配列)があるため(http://dumbotics.com/2009/02/24/hadoop-1722-and-typed-bytes/)、これは、Pythonコードが「カスタムjar」Javaコードよりも約25%遅いことを示しているので、私は間違いなくPythonルートに行きます。