Pythonの生産性とJavaの生産性


24

SOで、Google AppEngineでの開発に最適なプラットフォームは、JavaとPythonのどちらであるかという質問に出会いました。多くの人々は、Python over Javaを使用することで得られる生産性の向上を誇っていました。PythonとJavaの生産性の議論について私が言うことの1つは、Javaには開発をスピードアップする優れたIDEがあります。

そのため、言語としてPythonを使用することを好みますが、特に新しいフレームワークを使用する場合、Javaと比較して生産性が大幅に向上するとは考えていません。明らかにJava対Pythonであり、使用できる唯一のエディターがVIMである場合、Pythonは生産性を大幅に向上させますが、IDEが方程式に組み込まれると、それほど明確ではありません。

Javaのメリットは言語レベルでのみ評価される場合が多く、多くの場合、時代遅れの前提条件で評価されますが、Javaには、JVM(多くの場合批判されますが大きな可能性を提供します)、優れたIDEとツール、膨大な数のサードパーティライブラリ、プラットフォームなど。

質問、Python /関連の動的言語は、しばしば話題になっている生産性を大幅に向上させますか?(新しいフレームワークの使用と中規模から大規模のアプリケーションでの作業を考慮して)。


2
PyCharm IDEをチェックしてください。しかし、フロントエンドで使用するためにJavaコードをJavaScriptに変換するGAEの新しいフレームワークもあると思います。これは、生産性の大幅な向上につながる可能性があります。
アンドリューM

14
IDEであろうとなかろうと、1行のPythonで(まあ)できることのために、まだ10行のJavaを書く必要があります。

2
Javaに対するあなたの愛を恥じることはありません。いくつかのトリック(IDE、ライブラリ、およびフレームワーク)を学んだので、お尻を蹴ることができます。それを受け入れます。あなたは私たちからの許可を必要としません。Javaが生産性を高めれ、それで十分です。
スキャントロジャー

1
1)JVMの可能性は非常に限られています。故意に。それは「悪い」ものではなく、ただの、制限的なものです。2)IDEが役立つのは、何百もの既存のコンポーネントを統合する場合のみです(これは有効で名誉ある種類のプログラミングですが、唯一のものではありません)。複雑なアルゴリズムの実装に関しては、PythonはJavaよりもはるかに生産的です(ラムダ関数やリスト内包表記などでも大きな違いがあります)。
SKロジック

1
IDEによって生産性が大幅に向上した場合、可能性としては、あなたまたはプログラミングプラットフォームに重大な問題があることが考えられます。(Smalltalkはプログラミングの完全な反射システムを作成するため、これは例外です)。
マーチン

回答:


18

Pythonの主な利点の1つは、その「バッテリーを含む」という哲学です。広範で使いやすい標準ライブラリです。Javaでは、テキストファイルを読み取るには、数行のコード、ネストされたリーダーなどが必要です。Pythonでは、f.read()です。これは間違いなく、特に迅速なプロトタイピングにおいて生産性を大幅に向上させます。また、Python言語は一般に冗長性が低く、これは悪いことではありません(ただし、冗長性と簡潔さの重要性は強調されがちです)。

ただし、既にGAEなどのフレームワークで作業している場合は、違いがはるかに小さくなり、主に言語の個人的な流encyさまでになると予想されます。ほとんどの場合、選択した構文とともにフレームワークを配線するだけで、Pythonの優れた標準ライブラリはほとんど役に立ちません。


私は本当に GAEの使い方を学ぶ必要があります。おすすめのオンラインチュートリアルシリーズはありますか?私はPythonに精通していますが、GAEについての手がかりはありません。ありがとう!


4
または、Maven構成の行でApache Commons IOを追加し、1行でファイルを読み取ることもできます。バッテリー付属のアプローチは、私にとって両刃の剣です。
ジギー

@jiggy:ある程度同意します。Pythonのバッテリーはほとんどの場合に有用であり、多くの場合十分です。しかし、明らかに標準ライブラリはすべての可能な目的に応えることができないため、時々ライブラリにフォールバックする必要があります。
ジョナスプラッカ

2
java:でテキストファイルを読み取りますList<String> lines = Files.readAllLines(Paths.get("file.txt"), Charset.forName("UTF-8"));。悪くない!(これは3月11日にまだリリースされていないjava 7です)。
assylias

19

これが私の2セントです。私の経験では、Pythonは小規模から中規模のプロジェクトに適していますが、大規模なプロジェクトにはJavaの生産性が高くなっています。

一般に、小規模プロジェクトにはPython(またはPHP)のような動的に型付けされた言語を使用できます。複雑すぎず、すぐに実行したいので、失敗する可能性があまりありません。この場合、Pythonを使用する方が実用的であることがわかります。

ただし、より大きなソフトウェアを開発する必要がある場合は、Javaのような静的に型付けされた言語を使用します。これは、コンパイラができるだけ多くのチェックを実行することを好むためです。私の経験では、大規模なプロジェクトではJavaよりもPythonでバグを修正するのに多くの時間を費やさなければならないので、Javaでコードを書くのに少し時間がかかっても気にしません。


6
+1、完全に同意します。Pythonや同様の言語を小さなプロジェクトで使用するのが大好きです。問題は、コンポーネント間のインターフェースを推測する必要がある大規模なプロジェクトで発生します。これに弱いリファクタリングのサポートを組み合わせることで、大規模で安定した保守可能なシステムを作成する自信がなくなります。コンパイラーが実行する静的解析の不足を補うために、多くのテストを作成して保守する必要があります。この時点に達すると、初期の迅速な反復の利点は維持されなくなります。
bunglestink

私は両方を使用し、私は両方が好きです。私はあなたに完全に同意します。
ダニエルバクティア

11

PythonやRubyなどのより強力な言語で生産性が大幅に向上しました。一部のJavaコードをIDEで生成できるかどうかは関係ありません。読み取りおよび保守するコードがさらにあります。繰り返しコードを調べて重要な部分を見つけるのに時間がかかり、変更するのに時間がかかります。Eclipseが変換できることは問題ありません

private Date dateOfBirth;

に:

private Date dateOfBirth;
public Date getDateOfBirth() { return dateOfDeath; }
public setDateOfBirth(Date d) { dateOfBirth = d; }

しかし、クラスを開くたびに、そのジャンクを見て、興味深い部分を見つけるためにそれをすり抜けなければなりません。また、メンテナンス中に、生成されたコードにエラーが発生する可能性があります。

私はむしろ見たいです:

attr :date_of_birth

私にとって、IDEがJavaで効果的に機能する必要性は、別の言語を選択する正当な理由です。

おそらくもっと強力に、このRubyコードを比較してください:

avg = people.filter { |p| p.height > 200 }.collect(:weight).average

同様のJavaコードに対して:

List<Double> weights = new ArrayList<Double>();
for (Person p: people) {
  if (p.getHeight() > 200) {
    weights.add(p.getWeight());
  }
}
return Stats.average(weights);

Rubyコードは、仕様を直接翻訳したものです。200(cm)を超える人の平均体重です。コメントはまったく冗長です。

Javaコードでは、書き込みと読み取りの両方にかなりの作業が必要です。

ポールグラハムはこのエッセイでプログラミング言語の簡潔さについて説得力のある議論をしています。大学院レベルの数学をいくつか行ったので、彼の議論は説得力があり、簡潔さに対する議論は弱いと感じました。確かに、単純な加算よりも偏微分方程式が理解しにくいのと同様に、高レベル言語の単一行は低レベル言語の単一行よりも理解しにくい場合があります。しかし、強力な言語の1行は、置換する5行または10行よりも理解しやすいです。記号の代わりに単語を使用して書かれた数学テキストを読むことを想像してください。


Pythonは使用しませんでしたが、自動プロパティを持つC#を使用しました。Pythonでロジックを追加すること(たとえば、イベントまたは検証ロジックを起動すること)は、Pythonでどのくらいの作業ですか?
mlk

@mlk-"attr"ステートメントはRubyのものです。Rubyでは、プロパティが設定されたときに動作をアタッチするのは非常に簡単です。
ケビンクライン

Pythonでは、すべてのクラス属性は自動的に公開されるため、ほとんどの場合、それらに直接アクセスします。
Zhehao真央

3
Pythonはゲッターやセッターを必要としません- dateOfBirth公開するだけです。後でgetまたはsetでロジックを追加する必要がある場合は、a _dateOfBirthを追加してデータを保存し、getメソッドとsetメソッドの両方でproperty名前dateOfBirth付きを作成します。Pythonでは呼び出し元のコードを変更する必要はまったくありません。Javaは「プロパティ」の概念を持たないため、アクセサのみを使用します。
イズカタ

1
Java 8とストリームを使用すると、平均体重コードは次のように記述できますpeople.stream().filter(p -> p.getHeight() > 200).mapToDouble(Person::getWeight).average().orElse(0);
試験管

7

数年前にJavaからPythonに移行し、個人的には生産性が向上したと感じています。@Joonasが指摘するように、生産性の多くはパッケージ化されたライブラリから得られます。しかし、その一部は言語自体からのものです。辞書、リスト内包表記、高階関数、シェルがないとは想像できません。

すでにJavaを知っている場合は、Pythonに堪能になるまでに時間がかかることに注意してください。


7

これは少し古い質問ですが、$。03を追加したいと思います。それはあなたの考え方にも大きく依存すると思います。私にとっては、動的なインタープリター言語には耐えられません。一方、私は静的に型付けされた言語の大ファンです。もちろん、Javaを使用するとより冗長になる可能性がありますが、すべてのことを言って完了したら、読みやすく、保守しやすくなります。Python、Ruby、Perlは非常に読みにくいと思います(私にとって)。試したにもかかわらず頭を包み込むことができません。そうは言っても、Scalaでコードをうまく書くことができ、大したことではありません。それはあなたが何に慣れているかによると思います。結局のところ、Javaはより強力になります。Ruby、Python、またはPerlよりも優れています。JVMは魅力的なテクノロジーであり、JVMのパワーを活用することを学ぶことは、あなたにとって非常に有益であることがわかります。


1
Pythonを非常に高速でハックできることは確かですが、後でデバッグしたり、新しい機能を追加したりするのは悪夢になる可能性があります。そのため、「プロトタイプ言語」と呼ばれることが多く、一時的なタイプのスクリプト)
programmx10

2
その日の終わりはいつですか?私たちは20年ほど待っていましたが、Javaにはまだ一流の機能やメタプログラミング機能がありません。それまでの間、C#は飛躍的に進歩しました。過去1年間、Javaの代わりにGroovyコードを書き始め、生産性が飛躍的に向上しました。Groovyコードは、ノイズがなくなっているため、対応するJavaコードよりもはるかに小さく、理解しやすいです。
ケビンクライン

@Kevin Cline-あなたが言っていることは知っています-私は、6年ほど前から.NET開発者でした。私は単に生産性について話しているのではなく、コンパイル時間、同時実行性、およびマルチコアタイプのものだけについて話しています。JavaとJVM(Groovy、Scalaなど)JVMは、ここで最も重要なことであり、必ずしもJava自体ではありません。
ノードノーノードガイ

2
@ programmx10 Pythonコードの保守性は、コードの記述方法に依存します。すべてを1つにまとめると、もちろんデバッグできなくなります。一方、コードを適切に編成し、機能をモジュールとクラスに分離した場合、Javaコードと同じくらい簡単に(簡単ではないにしても)保守できます。
Zhehao真央

5

Python、Ruby、Javascript、およびSQLは、Javaなどのコンパイルされた言語よりもはるかに生産的であることがわかります。これらの言語には非常に迅速なフィードバックループがあるためです。コマンドラインで数行のコードを実行し、コードが正しいかどうかをすぐに知ることができます。例外がスローされる場合、すぐにわかります。Javaでは、大規模システムでは数分かかることがあるコンパイル、パッケージ、およびデプロイが必要であり、これによりフィードバックサイクルが非常に遅くなります。

迅速なフィードバックサイクルにより、優れたソリューションをすばやく反復することができ、それが動的言語の生産性を高めます。


用語の素晴らしい応用feedback loop
両生類14年

3

私は最近、もっと多くのpythonをやっており、長い間Javaプログラマーでした。そして、新しい開発のために、私はpythonの生産性がかなり高いと思います。ファイル/ストリーム処理、URLからの読み取り、XMLのシリアル化など、Javaのかなり単純なことの多くは、「退屈な」方法で少し退屈なものになります。 pythonで1つだけを取ります。ただし、グアバや別のコレクションAPIなどの適切なツールを使用すれば、これに役立ちます。

Pythonの利点の1つは、Javaのサードパーティライブラリを使用して取得する必要がある多くの機能が付属していることだと思います。

とはいえ、特定の事柄については、特に大きなコードベースなどのリファクタリングと作業に関しては、Pythonの場合よりもJavaのほうがはるかに生産的です。


1
ただし、Javaにはライブラリがすべてです。Pythonには、PHPのように、それらをすべて覚えるのが難しいところがあります。Javaでは、適切なライブラリを検索するだけで、少なくとも次の選択肢があります。使用するものに
programmx10

1
@ programmx10何を言ってるの?Pythonには、あらゆる種類のライブラリがたくさんあります。標準ライブラリのドキュメントをご覧ください。Pythonライブラリーは、Javaライブラリーがパッケージに分離されているように、モジュールに分離されています。
Zhehao真央
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.