web-dev-qa-db-ja.com

Python Numpy / Scipyとビッグデータ分析用の純粋なC ++

比較的小さなプロジェクトでPythonを実行すると、この言語の動的に型指定された性質(型を追跡するための宣言コードが不要)を理解できます。ただし、はるかに大規模なプロジェクトでは、コードの実行速度が言うよりも遅くなるため、これは実際には障害になる可能性があると感じています。C++での同等の機能です。しかし、繰り返しになりますが、PythonでNumpyやScipyを使用すると、ネイティブC++プログラムと同じくらい速くコードを実行できる場合があります(C++のコードの開発に時間がかかる場合があります)。

スレッドに関するJustinPeelのコメントを読んだ後、この質問を投稿します " PythonはC++よりも高速で軽量ですか? "また、Python深刻な数の計算に時間がかかるため、NumpyモジュールとScipyモジュールは使用されていません。Pythonは、最近の科学コンピューティングで実際に普及しています。もちろん、速度はCまたはライブラリで記述されたモジュールを使用することで得られます。 Fortranで書かれていますが、それが私の意見ではスクリプト言語の美しさです。」または、S。LottがPythonに関して同じスレッドで書いているように、「...メモリを管理するので、メモリ管理を行う必要がなく、コアリークを追跡する時間を節約できます。」また、Python/Numpy/C++関連のパフォーマンスに関する質問を「 ベンチマーク(BLASを使用したpythonとc ++)および(numpy) 」で調べました。ここで、JFSebastianは「... C++と私のマシンのしびれ。」

これらのスレッドは両方とも、パフォーマンスが明らかに非常に重要である「ビッグデータ」を分析するソフトウェアを生成するためにNumpy/Scipyを使用するPythonプログラマーにC++を知ることに与えられる本当の利点があるかどうか疑問に思いました(しかし、コードの可読性と開発速度も必須です)?

注:私は特に巨大なテキストファイルの処理に興味があります。複数の列を持つ100K〜800K行のオーダーのテキストファイル。ここで、Pythonは、200K行の「たった」ファイルを分析するのに5分ほどかかる場合があります。

12
warship

まず、「作業」の大部分が巨大なテキストファイルの処理に起因する場合、プログラミング言語に関係なく、意味のある速度のボトルネックはディスクI/O速度だけであることを意味します。


核となる質問に関しては、「答える」にはおそらく意見が多すぎるでしょうが、少なくとも私自身の経験をあなたに与えることができます。私は何年もの間、ビッグデータ処理(気象および環境データ)を行うためにPythonを書いてきました。言語が原因で、重大なパフォーマンスの問題に遭遇したことは一度もありません。

開発者(私自身を含む)が忘れがちなのは、プロセスが十分に速く実行されると、それを実行するために時間を費やすのは会社のリソースの無駄だということです。もっと早く。 Python( pandas / scipy などの成熟したツールを使用)は、要件を満たすのに十分な速度で実行されます、そして開発は速いので、私のお金では、「ビッグデータ」処理に完全に受け入れられる言語です。

11
Henry Keiter

簡単に言えば、単純な問題の場合、大きな違いはないはずです。複雑なことをしたい場合は、すぐにパフォーマンスの大きな違いに遭遇します。

簡単な例として、3つのベクトルを一緒に追加してみてください

a = b + c + d

Pythonでは、私が理解しているように、これは通常、bcに追加し、結果をdに追加して、その最終結果をポイントします。これらの各操作は、BLASライブラリにファームアウトされているため、高速に実行できます。ただし、ベクトルが大きい場合、中間結果をキャッシュに保存することはできません。その中間結果をメインメモリに移動するのは遅いです。

Valarrayを使用してC++で同じことを行うことができ、それは同等に遅くなります。ただし、他のこともできます

for(int i=0; i<N; ++i)
  a[i] = b[i] + c[i] + d[i]

これにより、中間結果が取り除かれ、コードがメインメモリの速度にあまり敏感になりません。

pythonで同等のことを行うことは可能ですが、pythonのループ構造はそれほど効率的ではありません。境界チェックのような素晴らしいことを行いますが、セーフティを解除した状態で実行する方が速い場合があります。Java、forたとえば、境界チェックを削除するためにかなりの量の作業を行います。したがって、十分にスマートなコンパイラ/ JITがあれば、Pythonのループは高速になる可能性があります。実際には、それはうまくいきませんでした。

5
Damascus Steel

Pythonは間違いなく開発時間を節約します。ここで2つの言語を比較するだけの場合も柔軟性がありますが、/の能力とパフォーマンスにはまだ匹敵しません。C/C + +しかし、この時代のハイメモリ、クラスター、キャッシング、並列処理技術を気にするのは誰ですか? C++のもう1つの欠点は、クラッシュの可能性であり、ビッグデータを使用したデバッグと修正は悪夢になる可能性があります。

しかし、すべての解決策が利用できる1つのサイズがある場所を見たことがないと言っても、すべての問題の解決策を含むプログラミング言語はありません(Cでデータベースを構築するのが好きな古いネイティブC開発者でない限り: )最初に、すべての問題、要件、データの種類、構造化されているかどうか、どのような方法と順序で操作する必要があるテキストファイルの種類、問題のスケジュール設定などを特定する必要があります...次にいくつかのツールセットとスクリプト言語を使用して、アプリケーションの完全なスタックを構築する必要があります。いつでもハードウェアにもっとお金をかけることができるように、またはAb Initioのような高価なツールを購入することもできます。これにより、これらの大きなテキストファイルを読み込んで解析し、操作することができます。本当にbigggのデータファイルで実際のハイエンドのパターンマッチング機能が必要ない場合を除いて、データに対してpythonは、他のツールを組み合わせても問題ありません。しかし、単一のツールは表示されません。はい/いいえの回答、特定の状況では、pythonが最善の解決策ではない場合があります。

1
Naumann