web-dev-qa-db-ja.com

Google App EngineでJava vs Pythonを選択する

現在、Google App EngineはPythonとJavaの両方をサポートしています。 Javaサポートはそれほど成熟していません。ただし、Javaはライブラリのリストが長く、特にそのコードの記述に使用される言語に関係なくJavaバイトコードをサポートしているようです。どの言語がパフォーマンスとパワーを向上させるでしょうか?お知らせ下さい。ありがとうございました!

編集:http://groups.google.com/group/google-appengine-Java/web/will-it-play- in-app-engine?pli = 1

編集:「パワー」とは、フレームワークの外で利用可能なライブラリの拡張性と組み込みを改善することを意味します。 Pythonは、純粋なPythonライブラリのみを許可します。

160
Viet

私は偏っています(Pythonエキスパートですが、Javaでかなり錆びています)が、GAEのPythonランタイムは、現在、Javaよりも高度で開発が進んでいると思います。 _ランタイム-前者には、開発と成熟のためにもう1年余りあります。

もちろん、物事がどのように進むかを予測するのは難しいです-Java側の需要はおそらくより強いでしょう(特にJavaだけでなく、JVMの上に位置する他の言語も同様であるため、 App EngineでのPHPまたはRubyコードの実行方法);ただし、Python App Engineチームには、Pythonの発明者であり、驚くほど強力なエンジニアであるGuido van Rossumが参加しているという利点があります。

柔軟性の観点から、Javaエンジンは、既に述べたように、Javaだけでなく、複数の言語で作成されたJVMバイトコードを実行する可能性を提供します。 -かなり大きなポジティブな言語ショップ。逆に、Javascriptを嫌うがユーザーのブラウザでコードを実行する必要がある場合、JavaのGWT(JavaレベルのコーディングからJavascriptを生成する)は、Python側の選択肢よりもはるかに豊富で高度です(実際には、選択した場合Pythonでは、この目的のために自分でJSを作成することになりますが、Javaを選択した場合、JSを作成するのが嫌いならGWTを使用できます。

ライブラリに関して言えば、JVMは既存のJavaライブラリの単純な再利用を妨げるほど十分に制限されています(スレッド、カスタムクラスローダー、JNI、リレーショナルDBがありません)。または、既存のPythonライブラリよりも、Pythonランタイムの同様の制限によって同様に妨げられます。

パフォーマンスの面では、私はそれはウォッシュだと思いますが、独自のタスクのベンチマークを行う必要があります-高度に最適化されたJITベースのJVM実装のパフォーマンスに依存しないでください。環境は非常に異なります(アプリのインスタンスが起動、停止、別のホストに移動されるなど、すべて透過的にあなたに見えないため、起動コストはしばしば支払われます-そのようなイベントは通常Pythonランタイムではるかに安くなりますJVMを使用する環境よりも)。

XPath/XSLTの状況(e曲的に...)は、どちらの側でも完全に完璧ではありませんが、ため息がありますが、JVMでそれほど悪くないかもしれません(明らかに、Saxonの実質的なサブセットを実行することができます) 、注意してください)。 Appengine Issues のタイトルにXPathとXSLTを含むページで問題を開く価値があると思います-現在のところ、特定のライブラリを要求する問題のみがあり、それは近視です:私は本当に気にしませんPythonおよび/またはJavaに使用する限り、良いXPath/XSLTが実装されます。 (特定のライブラリは既存のコードの移行を容易にするかもしれませんが、それは「XSLT変換を迅速に適用する」などのタスクを何らかの方法で実行できるよりも重要ではありません!-)。 (特に言語に依存しない方法で)適切に表現すれば、このような問題にスターを付けることを知っています。

最後になりましたが、アプリの異なるバージョン(同じデータストアを使用)を使用できます。その一部はPythonランタイムで実装され、一部はJavaランタイムで実装されます。明示的なURLを使用して、「デフォルト/アクティブ」バージョンとは異なるバージョンにアクセスできます。したがって、PythonandJavaコード(アプリの異なるバージョン)の両方を使用および変更することができます同じデータストアで、さらに柔軟性が向上します(ただし、foobar.appspot.comなどの "Nice" URLは1つだけになります。これはおそらく、ブラウザ上の対話ユーザーによるアクセスにのみ重要です;-)。

123
Alex Martelli

PythonおよびJavaのパフォーマンスの変化については、このアプリをご覧ください。

http://gaejava.appspot.com/ (編集:おologiesび申し上げますが、リンクは現在切断されています。しかし、最後に実行しているのを見たときに以下のパラが適用されます)

現在、PythonおよびJavaで低レベルAPIを使用することは、JavaのJDOよりも高速です。この簡単なテストでは。少なくとも基礎となるエンジンが変更された場合、そのアプリはパフォーマンスの変更を反映する必要があります。

71
Richard Watson

これらのVMを他のプラットフォームで実行した経験に基づいて、おそらくJavaからPythonよりも生のパフォーマンスが得られると思います。ただし、Pythonのセールスポイントを過小評価しないでください:Python言語は、コード行の面ではるかに生産的です-一般的な合意は、Pythonのコードの3分の1が必要です同等のJavaプログラム、またはより読みやすいまま。この利点は、明示的なコンパイル手順なしですぐにコードを実行する機能によって倍増します。

利用可能なライブラリに関しては、大規模なPythonランタイムライブラリの多くがすぐに動作することがわかります(Javaの場合と同様)。人気のDjango Webフレームワーク( http://www.djangoproject.com/ )もAppEngineでサポートされています。

「パワー」に関しては、意味を理解するのは難しいですが、Pythonは多くの異なるドメイン、特にWebで使用されています。YouTubeはSourceforgeと同様にPythonで書かれています(先週現在)。

18
Judy2K

2013年6月:このビデオはGoogleエンジニアによる非常に良い答えです:

http://www.youtube.com/watch?v=tLriM2krw2E

TLDR;は:

  • あなたとあなたのチームが最も生産性の高い言語を選択してください
  • 本番用に何かを構築する場合:JavaまたはPython(Goではありません)
  • 大きなチームと複雑なコードベースがある場合:Java(静的コード分析とリファクタリングのため)
  • すばやく反復する小さなチーム:Python(ただし、Javaも大丈夫です)
15
Bijan

PythonとJavaを決定する際に考慮すべき重要な質問は、各言語でデータストアを使用する方法です(および元の質問に対する他のほとんどの角度は、このトピックで既に十分にカバーされています)。

Javaの場合、標準的な方法はJDOまたはJPAを使用することです。これらは移植性には優れていますが、データストアにはあまり適していません。

低レベルAPIは使用可能ですが、これは日常的に使用するには低すぎます-サードパーティライブラリの構築に適しています。

Pythonには、アプリケーションにデータストアへの簡単かつ強力なアクセスを提供するために特別に設計されたAPIがあります。ポータブルではないので、GAEにロックされます。

幸いなことに、両方の言語にリストされている弱点に対して開発されているソリューションがあります。

Javaでは、低レベルAPIを使用して、JDO/JPA(IMO)よりもデータストアにより適した永続性ライブラリを開発しています。例には、 Sienaプロジェクト および Objectify が含まれます。

私は最近Objectifyの使用を開始しましたが、非常に使いやすく、データストアに適していることがわかりました。その人気の高まりは良いサポートにつながりました。たとえば、Objectifyは、Googleの新しいCloud Endpointsサービスによって公式にサポートされています。一方、Objectifyはデータストアでのみ機能しますが、Sienaはデータストアに「触発」されていますが、SQLデータベースとNoSQLデータストアの両方で機能するように設計されています。

Pythonの場合、GAEからPython GAEデータストアAPIを使用できるようにする努力がなされています。 1つの例は、GoogleがSDKで使用するためにリリースしたSQLiteバックエンドですが、彼らがこれを本番用の製品に成長させるつもりはないと思います。 TyphoonAE プロジェクトはおそらくより多くの可能性を秘めていますが、まだ生産準備が整っているとは思いません(間違っている場合は修正してください)。

これらの代替案のいずれかを経験したことがある人、または他の人を知っている人は、コメントに追加してください。個人的には、GAEデータストアが本当に好きです。AWSSimpleDBよりも大幅に改善されていることがわかりました。そのため、これらを使用する際の問題のいくつかを軽減するための努力が成功したいと思います。

9
Tom

GAEにはJavaを強くお勧めします。その理由は次のとおりです。

  1. パフォーマンス:JavaはPythonよりも潜在的に高速です。
  2. Pythonの開発は、サードパーティのライブラリが不足しているというプレッシャーにさらされています。たとえば、Python/GAE用のXSLTはまったくありません。ほぼすべてのPythonライブラリーはCバインディングです(GAEではサポートされていません)。
  3. Memcache API:Java SDKには、Python SDKよりも興味深い機能があります。
  4. データストアAPI:JDOは非常に低速ですが、ネイティブJavaデータストアAPIは非常に高速で簡単です。

現在、開発中のJava/GAEを使用しています。

7
Paul

私は、Python/Django SDKがどれほどきれいで、簡単で、問題がないかを驚かせました。しかし、さらにJavaScriptを実行する必要がある状況に陥り始め、GWTやその他のJavaユーティリティを利用したいと思うかもしれません。私はGAE Javaチュートリアルのちょうど半分を終えましたが、Eclipseの構成の問題、JREバージョンの問題、Javaの気が遠くなるような複雑さ、混乱し、壊れている可能性のあるチュートリアルなど、次々に問題が発生しました。このサイトとここからリンクされている他のサイトをチェックすると、私にとっては決まりました。 Pythonに戻り、JavaScriptの課題を解決するためにPajamasを調べます。

6
mjhm

既に確認したように、JVMを使用しても、Java言語の使用に制限されません。 JVM言語とリンクのリストは here にあります。 ただし、、Google App Engineは使用できるクラスのセットを通常のJava SEセットから制限しているため、これらの実装のいずれかがアプリエンジンで使用できるかどうかを調査します。

編集:私はあなたがそのようなリストを見つけたのを見ます

Pythonのパフォーマンスについてコメントすることはできません。ただし、JVMは実行時にコードを動的にコンパイルおよび最適化する機能を備えているため、パフォーマンスに関して非常に強力なプラットフォームです。

最終的にパフォーマンスは、アプリケーションの動作とコーディング方法に依存します。詳細な情報がない場合、この領域にこれ以上のポインタを与えることは不可能だと思います。

6
Brian Agnew

私は会話に少し遅れていますが、ここに私の2セントがあります。私は両方の言語に精通しているため、PythonとJavaを選択するのは本当に大変でした。誰もが知っているように、両者には長所と短所があり、要件とプロジェクトに最適なフレームワークを考慮する必要があります。

このタイプのジレンマで通常行うように、私は自分の決定を裏付ける数字を探します。さまざまな理由でPythonを使用することにしましたが、私の場合、転換点であるプロットが1つありました。 2014年9月の時点でGitHubで「Google App Engine」を検索すると、次の図が表示されます。

GAE Language Stats

これらの数には多くの偏りがある可能性がありますが、全体として、GAE PythonリポジトリはGAE Javaリポジトリの3倍です。それだけでなく、プロジェクトを「星の数」でリストすると、Pythonプロジェクトの大部分が上部に表示されます(Pythonは以前より長くなっています)。私にとって、これはPythonの強力なケースになります。なぜなら、コミュニティの採用とサポート、ドキュメント、オープンソースプロジェクトの可用性を考慮しているからです。

Javaの人々がPythonのユーザーと比べてAppEngineに不満を持っていると聞いた場合、Pythonを使用する方がストレスが少ないと思います。

3
Noah McIlraith

これは良い質問です。多くの回答が、フェンスの両側の長所と短所の良い見方を示していると思います。 PythonとJVMベースのAppEngineの両方を試しました(私の場合は Gaelyk を使用していました。これはAppEngine用に構築されたGroovyアプリケーションフレームワークです)。プラットフォームでのパフォーマンスに関しては、顔をじっと見つめるまで考慮していなかったことの1つは、フェンスのJava側で発生する「リクエストの読み込み」の意味です。 Groovyを使用する場合、これらの読み込み要求は致命的です。

私はトピックに投稿をまとめました( http://distractable.net/coding/google-appengine-Java-vs-python-performance-comparison/ )、私は方法を見つけたいと思っています問題を回避することはできますが、そうでない場合は、コールドスタートPythonリクエストが少なくなるまでDjango + Javaの組み合わせに戻ると思います影響。

3
Damon Oehlman

また、プロジェクト nladen Swallow があります。これは、Googleが所有していない場合は、明らかにGoogleが資金提供しています。彼らはPython 2.6.1バイトコードのLLVMベースのバックエンドを実装しようとしているため、JITとさまざまなNiceネイティブコード/ GC /マルチコア最適化を使用できます。 (いい引用:「私たちはオリジナルの仕事をやめ、代わりに過去30年間の研究を可能な限り使用することを目指しています。)」彼らはCPythonの5倍の高速化を探しています。

もちろん、これはあなたの当面の質問には答えませんが、将来(できれば)の「ギャップの閉鎖」(もしあれば)を指します。

2
synchromesh

最近のpythonの美しさは、他の言語との通信がどれほどうまくできるかです。たとえば、Jythonと同じテーブルにpythonとJavaの両方を含めることができます。もちろん、jythonはJavaライブラリを完全にサポートしていますが、pythonライブラリを完全にはサポートしていません。ただし、Javaライブラリをいじりたい場合は理想的なソリューションです。余分なコーディングなしでJavaコードと混合することもできます。

ただし、python自体でさえ、いくつかの手順を実行しないようにしています。たとえば、C typeの近くのctypesを参照してください。pythonコーディングの快適さを残さずに、これらすべてをCライブラリに直接アクセスしてください。 Cythonはさらに一歩進んで、cコードとpythonコードを簡単に混ぜることができます。または、cやc ++をいじりたくない場合でも、pythonでコーディングできますが、 pythonプログラムをCアプリと同じくらい高速にする変数を静的に入力します。ちなみに、CythonはGoogleによって使用およびサポートされています。

昨日、インラインCまたはアセンブリ(CorePyを参照)までのpython用のツールも見つけましたが、それ以上の強力なツールは入手できません。

Pythonは確かに非常に成熟した言語であり、単独で動作するだけでなく、他の言語と簡単に連携できます。 pythonが非常に高度で要求の厳しいシナリオでも理想的なソリューションになるのはそれが理由だと思います。

pythonを使用すると、C/C++、Java、.NET、およびその他の多くのライブラリにほとんどコーディングを追加せずにアクセスでき、コーディングを最小限に抑え、簡素化し、美化する言語を提供します。その非常に魅力的な言語。

2
kilon

GWTは私が開発している種類のアプリに完全に一致しているように見えますが、Pythonは廃止されました。 JPAはGAEでかなりめちゃくちゃになっています(たとえば、@ Embeddableやその他のあいまいな非文書化された制限はありません)。 1週間を費やして、Javaが現時点でGAEを正しく感じていないことを伝えることができます。

1
yanchenko

考慮する必要があるのは、使用する予定のフレームワークです。 Java側のすべてのフレームワークがApp Engineで実行されるアプリケーションに適しているわけではありません。これは、従来のJavaアプリケーションサーバーとは多少異なります。

考慮すべき1つのことは、アプリケーションの起動時間です。従来のJava Webアプリでは、これについて本当に考える必要はありません。アプリケーションが起動し、実行されるだけです。起動に5秒か2、3分かかるかどうかは問題ではありません。 App Engineを使用すると、リクエストが到着したときにのみアプリケーションが開始される状況になる可能性があります。これは、アプリケーションの起動中にユーザーが待機していることを意味します。リザーブドインスタンスのような新しいGAE機能はここで役立ちますが、最初に確認してください。

もう1つは、JavaのGAE PSOのさまざまな制限です。すべてのフレームワークが、使用できるクラスの制限、スレッドが許可されていない、またはローカルファイルシステムにアクセスできないという事実に満足しているわけではありません。これらの問題は、おそらくGAEの互換性についてグーグルで調べることで簡単に見つけることができます。

また、最近のUIフレームワーク(つまり、Wicket)でのセッションサイズの問題について不満を言う人もいます。一般に、これらのフレームワークは、開発を楽しく、速く、簡単にするために、特定のトレードオフを行う傾向があります。これにより、App Engineの制限と競合する場合があります。

最初はJavaでGAEの開発を始めましたが、これらの理由によりPythonに切り替えました。私の個人的な感情は、PythonがApp Engine開発に適した選択肢であるということです。 Javaは、たとえばAmazonのElastic Beanstalkではもっと「自宅」にあると思います。

BUT App Engineの状況は急速に変化しています。 GAEは変化しており、人気が高まるにつれて、フレームワークもその制限を回避するために変化しています。

1
Juha Palomäki