Pythonが高性能/科学計算に使用されているのはなぜですか(Rubyは使用されていません)?


106

PyCon 2011の講演から引用があります:

少なくとも当店(アルゴンヌ国立研究所)には、科学計算用に受け入れられている3つの言語があります。この順序では、C / C ++、すべての方言のFortran、およびPythonです。Ruby、Perl、Javaの完全かつ完全な欠如に気付くでしょう。

これは、より一般的な高性能コンピューティングのコンテキストでした。引用は1つのショップからのものにすぎませんが、HPCの言語に関する別の質問もPythonを学ぶべきものとしてリストしています(Rubyではありません)。

今、私はその問題空間で使用されているC / C ++とFortranを理解できます(そしてPerl / Java 使用されていません)。しかし、PythonとRubyのHPCでの使用にかなりの違いがあることに驚いています。(注-私はPythonのファンですが、Ruby に対しては何もありません)。

1つの言語が離陸した特定の理由はありますか?利用可能なライブラリについてですか?特定の言語機能はありますか?地域社会・共同体?それとも、単に歴史的隣接性、そしてそれは他の方法で行ったかもしれない?


2
PythonとRubyは両方とも動的言語ですが、まったく異なることをお勧めします。類似のものよりも異なる。
アダムクロスランド

20
これが答えだとは知りませんが、RubyがRails(2005-2006年頃)のある小さなコミュニティの外で離陸する前に、Pythonにはもっと「牽引力」があったことを思い出してください。Googleはしばらくの間Pythonを使用していたため、そのプロファイルが上がりました(2000年代初期)。Pythonの構文は明快で簡単に習得して読むことができます(また、これはPerlが他の唯一の主要な選択肢であった時代にあったことを思い出してください)。その後、NumPy / SciPy、MatPlotLib、および他の多くの科学計算パッケージを作成したため、おそらく自己強化型でした。
wkl

4
この質問に興味がある人は、計算科学スタック交換サイトをチェックすることにも興味があります。
マークブース

2
「読みやすさ」
-jsbueno

1
計算化学の観点を提供するために、Pythonで計算を並列化するのは簡単で、安価です。おそらく、これらの両方はRubyでも同様です。知りません。
ジョナサンランドラム

回答:


108

コメントについて詳しく説明します。

科学計算でのPythonの使用に影響を与えた要因はいくつかあると思いますが、「はい、それがPythonがRuby /その他で使用されている理由である」と言える明確な歴史的ポイントはないと思います」

初期の歴史

PythonとRubyの年齢はほぼ同じです-ウィキペディアによると、Pythonは1991年に正式にリリースされ、1995年にRubyが正式にリリースされました。

ただし、GoogleはすでにPythonを使用しており、ミレニアムの変わり目にPython開発者を探していたため、PythonはRubyよりも早く登場しました。プログラミング言語の使用とそれらを使用する人々への影響のキュレーションされた歴史があるわけではないので、GoogleによるPythonの早期の採用は、Matlab、C ++、 Fortran、Stata、Mathematicaなど

つまり、Googleは、数千台のマシン(並列化とスケール)を備えたシステムでPythonを使用し、数百万のデータポイント(繰り返し)を絶えず処理していました。

イベントコンフルエンス

サイエンティフィックコンピューティングは、SGIやCraysなどの特殊なマシンで実行されていました(覚えていますか?)

過去10年ほどで、コモディティハードウェア(あなたや私が億万長者でなくても買うことができるもの)が科学的で大規模なコンピューティングの領域に引き継がれました。現在の上位500位のランキングをご覧ください。世界の上位ランクの「スーパーコンピューター」の多くは、通常のIntel / AMDハードウェアで構築されています。

Pythonは、GoogleがPythonを宣伝し、Googleが汎用ハードウェアを使用しており、数千台のマシンがあったので、良い時期にやって来ました。

さらに、いくつかの古い科学計算の記事を掘り下げると、2000年ごろにそれらが出現し始めました。

以前のサポート

2000年に書かれた天文データ解析ソフトウェアおよびシステム向けに書かれ記事で、 Pythonを科学計算の言語として提案しています。

この記事には、Pythonに関する次の引用があります。

Pythonは、解釈されたオブジェクト指向プログラミング言語であり、科学アプリケーションでかなりの注目を集め始めています(Python、1999)。これは、Pythonおよび一般的なスクリプト言語が、多くの科学プロジェクトの次の論理的ステップを表しているためです(Dubois 1994)。最初に、Pythonはインタープリター型プログラミング言語を提供します。これは、科学プログラムで既に使用されている単純なコマンド言語の拡張として見ることができます

第二に、Pythonは他の言語で書かれたソフトウェアと簡単に統合できます。その結果、既存のプログラムを駆動するための制御言語としてだけでなく、異なるシステムを一緒に結合するためのグルー言語としても機能します。最後に、Pythonは、サードパーティモジュールの大規模なコレクション、確立されたユーザーベース、および書籍やオンラインリファレンスの形でさまざまなドキュメントを提供します。このため、科学者が独自のコマンドインタープリターを作成する際に達成しようとすることが多いものの、高度に洗練され拡張されたバージョンと考えるかもしれません。

そのため、Pythonは、当時の既存のシステムと機能的に類似していたため、またPythonをCや既存のプログラムなどと簡単に統合できるため、90年代後半にすでに牽引力があったことがわかります。この記事の内容に基づいて、Pythonは1995年から1996年まで遡ってすでに科学的に使用されていました。

人気の伸びの違い

Rubyの人気は、2004年に最初に登場したRuby On Railsの台頭とともに爆発しました。Rubyについての話題を初めて耳にしたのは2005年から2006年のことでした。django for Pythonは同じ時期にリリースされました(Wikiによると2005年7月)が、Rubyコミュニティの焦点はWebアプリケーションでの使用の促進に非常に集中しているように見えました。

一方、Pythonには既に科学計算に適したライブラリがありました。

  • NumPy -NumPyは2005年に正式に開始されましたが、NumPyが構築された2つのライブラリは以前にリリースされました:Numeric(1995)およびNumarray(2001?)

  • BioPython-少なくとも2001年に遡るPython用の生物学的コンピューティングライブラリ

  • SAGE -2005年初頭の最初の公開リリースを含む数学パッケージ

さらに、タイムラインの多くはわかりませんが(ダウンロードサイトを閲覧するだけでなく)、PythonにはSciPy(2006年にリリースされたNumPy上に構築)もあり、R(統計言語)とのバインディングがありました2000年代初頭、MatPlotLibを取得し、ipythonで非常に強力なシェル環境も取得しました。

ipythonは2000年代初頭に初めてリリースされ、統合されたmatplotlibのグラフ化や計算クラスタの管理など、科学計算に非常に役立つ多くの機能が追加されました。

上記の記事から:

Pythonに関連する他の多くの科学計算プロジェクトにも注目する価値があります。数値Python拡張機能は、Pythonに高速な配列と行列の操作を追加し(Dubois 1996)、MMTKは分子モデリング用のPythonベースのツールキット(Hinsen 1999)、Biopythonプロジェクトは生命科学研究用のPythonベースのツールを開発しています(Biopython 1999)、 Visualization Toolkit(VTK)は、Pythonバインディングを備えた高度な視覚化パッケージです(VTK、1999)。さらに、Pythonコミュニティで進行中のプロジェクトは、画像処理とプロットの拡張機能を開発しています。最後に、(Greenfield、2000)で発表された研究では、STScIのプロジェクトでのPythonの使用について説明しています。

Python用の科学および数値パッケージの良いリスト


したがって、その多くはおそらく初期の歴史と、2000年代までのRubyの相対的なあいまいさによるものでしたが、PythonはGoogleの伝道のおかげで牽引力を得ていました。

1995年から2000年の期間にスクリプト言語を評価していた場合、実際に何を見ていましたか?Perlはおそらく人々が使いたくないほど十分に構文的に異なっていて、それからPythonがあり、それはより明確な構文と読みやすさを持っていました。

そして、はい、おそらく多くの自己強化があります-Pythonには科学計算用の素晴らしい便利なライブラリがすでにありますが、Rubyには科学での使用を主張する少数の声があり、SciRubyのようないくつかのライブラリがありますが、 Pythonのツールは過去10年で成熟しました。

Rubyのコミュニティ全体は、RubyをWeb言語としてさらに普及させることに非常に大きな関心を持っているようです。


8
私はc統合について少し忘れていました。多くの場合、科学的計算は計算集約的であり、そのビットだけのACルーチンを作成できることは重要な利点です。
スペンサーラスブン

1
@SpencerRathbunリンクした記事では、SWIGでPythonを使用してラッパーを生成し、PythonがC / C ++コードと相互運用できるようにすることについて言及しています。2004年にリリースされたRuby 1.6まで、SWIGは公式のRubyサポートを取得していませんでした。使用されていた既存の最適化されたFORTRAN / Cコードをすべて捨てる必要がなかったことが、おそらく最大のドライバーでした。
wkl

3
1991年、TCLを使用して、大量のC / Fortranを記述することなくデータを分析する方法として、数値ライブラリを結び付けていました。PythonはちょうどTCLを置き換える適切なタイミングで登場しました。(およびFortranとのF2Cにより)「C」とのインターフェースの使いやすさは、PERL、「C」へのTCLインタフェースに比べて大したことは非常に簡単だった
マーティン・ベケット

優先添付プロセスでは、使用されている言語について非常に多くのことが説明されています。ジップフィアンです!Zipf Myateryの「PAP」は12:50に説明されています。を参照してください。
レーダーボブ

37

Pythonをエンジニアリングアプリケーションに、RubyをWebアプリケーションに広範に使用しました。

科学言語としてのRubyで見られる問題は、特定の操作に対して構文オプションが多すぎることです。

Pythonは、次の前提で設計されています。「1つ、できれば1つだけである必要があります-それを行うための明白な方法」。これにより、誰かのコードを読み、その意図を決定するのが非常に簡単になります。これは、エンジニアリングなどのピアレビューの鍵です。

私はRubyが好きで、特定のタスクには最適ですが、私のRubyコードは、まったく同じことをする別のプログラマーのコードとは構文的にまったく異なる場合があります。これにより、科学環境またはエンジニア環境ではあいまいさが多すぎます。


3
はい、そうです。RubyはTIMTOWTDIの伝統であるため、わずかに優れたPerlです。ソフトウェアはプログラマ向けに書かれています。その意味で、コンパイラー/インタープリターは二次的な聴衆です。科学者は、不必要に難しいソフトウェアからあまり干渉されずに仕事をこなすことに真剣になりがちです。QED
ドミニククローニン

4
私はこの議論に従っているのか定かではありません。機械ではなくプログラマーが主な対象者である場合、言葉遣いが異なって明確さを改善し、意図を強調する場合があります。より柔軟な言語は、人間の柔らかい脳による理解に役立ちませんか?
アンドリューヴィット

10
しかし、CはASCII Factoryでも爆発のように見えます。Cでは、配列はポインターの周りのスキンであることを思い出してください。したがって、array [5]は、代わりに*(array + 5)と書くこともできます。これは、代わりに*(5 + array)と書くことができ、5 [array]と書くこともできます。それは愚かです。
ジョナサンランドラム

1
私は非常に長期的なperlプログラマーであり、ほとんどの目的で私のお気に入りの言語のままです。しかし、数学についてはわかりません。TIMTOWTDIアプローチに対するこの態度には同意しません。多くのアプローチが利用できるということは、もちろんすべてが良いということではありませんが、表現を調整して、人間と機械の両方の視聴者に、表現しているアイデアに明確かつ直接マッピングできるようにすることが重要です。構文オプションの欠如はそれを助けません。
mc0e

@AndrewVit:必ずしもそうではありません。TIMTOWTDIは、開発者が1人いる場合、または小規模で緊密に統合された開発者チームがある場合に最適です。しかし、すぐにあなたが同じコードに取り組んで会ったことがない人は、自分自身を求めて開始するつもりだ持っているように、「ああ、なぜ彼らはそれを行うだろうその方法は?」または、代わりに、スタイルガイドを作成して、全員に同じ方法を強制し、その後TIMTOWTDIを実行しなくなります。
ケビン

17

推測では、それの大部分は多くの研究者によるMATLABへの依存でしょう。Pythonには、sageなどの代替手段があります。一方、ルビーにはない、または少なくとも明らかなものはありません。

第二に、Ruby FAQによると、Pythonは手続き型とオブジェクト指向の両方ですが、ルビーは手続き型言語としてマスカレードします。matlabで行うような数学目的の小さなスクリプトを書いている場合、オブジェクト指向のパラダイムは頭痛の種です。それだけでなく、研究者が使用している機能的/手続き的パラダイムから概念的なジャンプを強制します。数学オブジェクト指向ではありません。数学は機能的で、その後に手続き型があります(論理的証明を考えてください)。

最後に、Ruby FAQにはrubyはpythonよりも複雑であると記載されていることに注意してください。プログラミングは研究者にとって2番目であり、私たちのように最初ではありません。


22
OOのことはちょっとしたニシンだと思います。式がオブジェクトに1 + 1メッセージ+を送信するかどうか、研究者は何を気にします1か?それによってプログラムの構造が少しも変わることはありません。
sepp2k

1
@ sepp2k、スペンサーは、Rubyが科学者に異なるプログラミングを要求することを示唆していると思います。Rubyはわかりません、Rubyでプログラムを作成するためにオブジェクトを作成する必要あったと仮定すると、Pythonでは手続きが許可されます-これは精神的なオーバーヘッドに追加されます。大したことではありませんが、プログラマー以外の人にとっては、余分な仕事をするたびに別の言語を使用することになります。
サイクロプス

7
@Cyclops彼が提案していることを知っています。私はそれが間違っていると言っています。手続き型言語としてのルビーマスカレードについての引用の要点は、プログラムをオブジェクト指向の方法で構造化する必要がないということです。「2 + 2」などを入力すると、2つのIntegerオブジェクトを作成し、一方のメソッドを呼び出します(もう一方を引数として渡します)。ただし、他の言語で「2 + 2」と入力するよりも、Rubyで「2 + 2」と入力してもそれほど労力がかかるわけではありません。
sepp2k

5
私はsepp2kと一緒にいます。私もその議論を買いません。Javaのような一部の言語は、オブジェクト指向のパラダイムを強制します-Rubyではそうではありません。Rubyで純粋に手続き型または関数型のプログラムを書くことを妨げているのは何ですか?
マイクバランチャック

2
@Cyclops正確に。Rubyは手続き型のふりをすることができますが、重要なコンテキストでは、OOパラダイムが言語を特定の方法で機能させる状況に陥ります。あなたがそれを理解または無視しない場合、あなたはあなたが望むことをすることができないか、厄介なハックになってしまうかのどちらかです。
スペンサー

14

BDFL(Guido van Rossum)が最初にPythonを書いたときの目標は、一般的なコーディングエラーを排除する単純な英語(DARPAの資金調達提案)と同じくらい理解しやすいものにすることでした。

目立つ問題の1つは、インデントを使用してブロックを区切ることです。明示的な複雑なステートメント区切り文字(Cブレース、Pascal BEGIN / ENDなど)がある言語では、コードをレクサーに渡す前に空白が単一のスペース文字に折りたたまれます。これにより、コードのレイアウト方法を大きく変えることができます。

プロのプログラマーにとって、これは問題ではありません。なぜなら、彼らは週30時間以上の練習からそれを扱うように自分自身を訓練したからです。

プログラミングがツールである他の専門家にとって、この問題は大きな問題になります。このグループには、数学者、物理学者、化学者、エンジニアなどが含まれます。

Pythonは、プロではないプログラマーのエラーを減らすので、Pythonが解決しようとしている問題について考えることができ、言語の仕組みをあまり扱う必要がありません。

これは、プログラミングの専門家以外で人気がある理由の1つの例です。含まれている電池、The Zen of Python(import this)、Monty Pythonユーモアの使用など、同じポイントを説明するために使用できる他の例があります。


Guidoの履歴書または出版物リストに、論文または博士課程への参照が見つかりません。そのための引用はありますか?このインタビューは、彼がCWIの研究者だったと言っています。
M.ダドリー

私はそれについて完全に台無しにした。彼はそれについて論文であると読んだが、それについて適切な研究をしなかった。この投稿を書いた後、エラーを見つけましたが、ここでは修正しませんでした。ありがとう。
ランスヘルステン

5

これはここでのすばらしい議論です。ここでの投稿は、Pythonが科学コミュニティでより人気がある理由を本当に答えたと思います。ただし、ルビー科学にはいくつかの反論があります。

  • rubyはpython(DSLなど)よりも直感的にコーディングできます:適切なパッケージが使用されている場合:

    biorubyを確認してください:http ://bioruby.org/シーケンスの予約は単純にできます:s.reverseなどデータベースを使用する場合:rubyデータベースバインディングAPIは、おそらくPythonよりも優れています。

  • ルビーは、簡潔であると同時に高レベルの抽象化を可能にします。

  • 優れたパッケージ管理システム:ruby gemはsetuptools、pipなどと比較して非常に簡単です。

ただし、ルビーの採用は、その複雑さによって妨げられていました。Lispは素晴らしい/強力な言語だと思っていますが、なぜ一般的な言語として取り上げられなかったのですか?同様の状況がrubyでもあります-Lisp、Small Talk、Perlから多くのパワーを継承しています!:しかし、実際に利益を得るために使用するのは一部の人々だけです。最終的には、特定のニッチ/特別な領域(ウェブのレール、構成の人形など)で強いままである可​​能性があり、「非」プログラマーがそれを完全に楽しむのは難しいですが、プログラマーの良き友人である可能性があります科学者はこの言語を楽しんでいます:http : //www.cleveralgorithms.com/nature-inspired/index.html

いくつかの最新の更新:pythonがすでに風景を引き継いでいるようです。最近の書籍:http : //www.amazon.com/Python-Data-Analysis-Wes-McKinney/dp/1449319793 および他の多くの書籍(データ分析、機械学習など)はすべて、使用言語としてpythonで書かれています。 。ルビーが追いつくためには、いくつかの真剣な努力が必要です。Pythonでmatplotlibを検討すると、現在の状態に戻すのにおそらく数人年かかるでしょう。いくつかの真剣な努力がルビーに費やされない限り、おそらく今後2〜3年でpythonデータ分析/科学計算の段階に追いつくことはできません。


3

しばらくデータ分析にpythonを使用した後(ruby、lua、Rでの作業経験から)、numpyパッケージ(および関連する多くの科学ライブラリ)により、高速計算を実行できるようになりました(Cに類似した速度、numpyとしてPythonでのプログラミングが容易なCコードで記述/統合されています。

Numpyはしばらく存在していましたが、Scipy、Pandasなど、他の多くの関連する科学パッケージを構築するのに役立ちました。Pythonでは、Pythonが科学コンピューティングの優れたエコシステムになりました。計算ライブラリは開発中です(NMtrix:https : //github.com/SciRuby/nmatrix)。この大きなタイミングの違いにより、Pythonは科学コンピューティングの明らかな選択肢になります。


5
「結局のところ、pythonはみんなの言語のようなものです」、これをバックアップするにはソースを提供する必要があります。
ウォルター

2

私はこれと同じことを疑問に思ってきました。スペンサーラスブンが言ったように、Pythonの手続き的な側面のためだと思います。自分は「プログラマーではない」ので、Rubyでコーディングできる方法が美しく、使いやすさの点でRailsフレームワークが優れていると思います。ただし、科学的な目的(数学、生物学など)でコーディングする場合、通常は「数学的な」言語で考えます。つまり、次のような文は気にしません。

Person.find_by_name 'Juanito'

しかし、あなたはもっと気に

A = B*C + D

そのため、Rubyは強力で、その機能の多くは科学プログラムでは使用されないでしょう。手順を考えるだけで簡単です。


0

Numpyパッケージを使用すると、PythonでN次元配列のサポートが向上します。Rubyに似たものは見たことがありません。

Pythonは、私が行った数値計算/科学計算で高速であるようです。PythonとRubyで同様のアルゴリズムを記述したとき以外は、Pythonアルゴリズムの実行速度が速くなりました(YMMV)。


2
これは議論にあまり貢献しません。Numpyの有効性については、すでに受け入れられている回答で詳しく説明しています。あなたのパフォーマンスの議論は納得できません。歴史的なパフォーマンスを議論するとき、特に信頼できる(文脈のない逸話よりも信頼できる)ベンチマークでそのような議論が既に十分にカバーされている場合、私は逸話に頼るのは好きではありません。
ブライアン

@ブライアン、同意した。
ジョシュプチ

@ブライアン、私の特定の貢献は、N次元配列に関するコメントでした。これは、Numpyが構築されているものの中核です(はい)。ただし、NDアレイについては何も言及していません。これは線形代数の中心であり、MatlabとNumpyがうまく機能します。Rubyは、プログラマーが配列を使用するように配列を使用しますが、エンジニアや科学者が配列(マトリックス)を使用するのではありません。役立つと思われる場合は、NDアレイに関するコメントを承認済みの回答に追加します。
ジョシュペティット

@ブライアン、そして私はまだ、科学コンピューティングのためのRubyのNDアレイのサポートが見られないという私のコメントを支持しています。
ジョシュペティット

0

1つの理由は、PythonがC / C ++コードの使用/統合/呼び出しを適切にサポートしているのに対し、Rubyは同程度の(簡単な)統合を提供していないためです。つまり、高性能なコードコンポーネントをC / C ++で記述してから、Python(つまり、高レベルで使いやすい言語)を使用して、すべてを結び付けることができます。これも、Googleによる早期の制度導入の理由の1つだと思います。


0

Pythonがデータサイエンスで人気を博した主な理由の1つは、スクリプトを実際のソリューション(ソフトウェアシステムなど)に拡張するために節約できる時間/労力(つまり、お金)のためだと思います。Pythonを使用すると、データサイエンス用に記述したコードに基づいてシステムソリューションをより簡単に構築できます。

約15年前に、この機能を使用してインタープリター言語を検索した経験があります。当時、Pythonはデータサイエンスに最適な言語ではなく、C / C ++ /などの他の言語とのインターフェイスにも拡張可能な高速/ポータブルインタープリターを備えたまれなOOP言語であったため、Pythonが選ばれました。 Java。最近とは異なり、これらは素晴らしいが、データサイエンス用に既に実装されている基本コードからソリューションを直接構築するためのまれな機能でした。

時間は、データサイエンス言語を作成するためのもう1つの重要な要素かもしれません。15年前、Pythonの数値計算用の数値やscipyなどの基本的なパッケージが既にあることがわかりましたが、プログラミング言語としてのRubyの存在すら知りませんでした。2018年後半の時点で、データサイエンスにRubyを使用したプロジェクトをいくつか見つけることができました。たぶん10年後、RubyがAIでそれほど人気が​​ある理由を尋ねるかもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.