在Google App Engine上选择Java vs Python


161

目前,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库。


现在,Google App Engine支持 Go(实验性)。您对此有何看法?
本杰明·克鲁兹耶

@pinouchon我已经开始使用Go,并将其部署在GAE的生产环境中。GO在GAE上运行良好,几秒钟即可完成编译。明智地选择Web框架:-)
Michele Giuseppe Fadda 2015年

Answers:


123

我有偏见(是一名Python专家,但对Java却很生疏),但我认为GAE的Python运行时目前比Java运行时更先进和更好地开发-毕竟前者还有一年多的开发和成熟时间。

事情的进展当然很难预测-Java方面的需求可能会更强(特别是因为它不仅与Java有关,而且其他语言也位于JVM之上,因此这是运行方式,例如PHP或App Engine上的Ruby代码);但是,Python App Engine团队的确拥有加入Python的发明者,非常强大的工程师Guido van Rossum的优势。

在灵活性方面,如前所述,Java引擎确实提供了运行由不同语言(不仅是Java)制作的JVM字节码的可能性-如果您在一家多语言商店中,那肯定是很大的。反之亦然,如果您讨厌Javascript但必须在用户的浏览器中执行一些代码,则Java的GWT(通过Java级编码为您生成Javascript)比Python端的替代方案(实际上,如果您选择Python,您将为此目的自己编写一些JS,而如果您选择Java GWT,则如果您讨厌编写JS,则可以使用它。

就库而言,这几乎是一种洗礼- JVM受到足够的限制(没有线程,没有自定义类加载器,没有JNI,没有关系数据库),以至于妨碍了现有Java库的简单重用,甚至超过了现有Python。类似地,Python运行时的类似限制也限制了库。

就性能而言,尽管您应该以自己的任务为基准,但我认为这是一种洗礼–不要依赖高度优化的基于JIT的JVM实现的性能,因为它们会浪费大量的启动时间和内存,因为应用引擎环境是非常不同的(启动成本将经常支付,因为您的应用实例被启动,停止,移动到其他主机等)对您来说都是透明的-与Python相比,使用Python运行时环境这些事件通常要便宜得多。

叹气,尽管我认为XPath / XSLT的情况在两侧都不是完美的,但我认为这在JVM中可能会稍微好一些(显然,可以使Saxon的实质子集运行) ,但要小心)。我认为值得在Appengine问题页面上以XPath和XSLT作为标题来打开问题-现在只有问题需要特定的库,这是近视的:我真的不在乎如何实现良好的XPath / XSLT,只要适用于Python和/或Java。(特定的库可能会简化现有代码的迁移,但是这比能够以某种方式执行“快速应用XSLT转换”这样的任务要重要!)。我知道如果措辞得当(尤其是以与语言无关的方式),我会盯上这样的问题。

最后但并非最不重要的一点:请记住,您可以拥有不同版本的应用程序(使用相同的数据存储),其中一些版本是通过Python运行时实现的,某些版本是通过Java运行时实现的,并且您可以访问不同于“默认/活动”的版本”带有明确的网址。所以你可以同时拥有Python Java代码(在应用的不同版本中)使用和修改同一数据存储,从而为您提供更大的灵活性(尽管只有一个拥有“ nice” URL,例如foobar.appspot.com)我想这可能仅对交互式用户在浏览器上的访问很重要;-)。


9
GWT主要是一种客户端技术-无论后端是python还是java,您都可以使用它。您必须通过JSON而不是GWT内置的RPC来在JSON上执行rpc,从而损失了一些语法上的糖,但是,如果您讨厌JS并使用python,仍然值得一看:)
Peter Recore 09年

9
有一个睡衣(pyjs.org)作为GWT的Python替代品-它将使用Python代码并将其编译为Javascript,就像GWT处理Java代码一样。
戴夫·柯比

7
只是给出“ 5年后”的观点。作为Java开发人员,我觉得GAE正在运行一个过时的堆栈。您不会找到Java 8支持它们正在运行Java 6以及带有Servlet API 2.5的旧式Jetty 6容器),而GAE的所有Java支持仍然停留在2010年。我不推荐GAE for Java,除非他们升级了它的堆栈。
Anthony Accioly 2014年

72

观看此应用,了解Python和Java性能的变化:

http://gaejava.appspot.com/ (编辑:道歉,链接现在已断开。但是,当我看到它最后运行时,以下para仍然适用)

目前,对于此简单测试,Python和在Java中使用低级API的速度比Java上的JDO快。至少如果基础引擎发生变化,则该应用应反映出性能变化。


5
出于所有应有的尊重,我发现此测试非常简单,毫无意义。物有所值...如果您确实使用Java / GAE,建议您使用低级API,并避免使用JDO或任何其他框架。更重要的是,JDO给您使用关系数据库的“感觉”,这可能是“误导”的。
Mo'in Creemers 2010年

1
我同意避免使用JDO,部分原因是您提到的原因,但也因为它比低级速度慢。(通常会显示该测试。)它只是暗示性能存在差异,因此请不要使用JDO或对您的特定任务进行测试。我已经将所有自己的代码从JDO和低级API移到了Objectify。而且无论如何,这也表明Py​​thon肯定不是GAE性能的差强人意。
理查德·沃森

1
您的应用程序抛出内部服务器错误。
tomdemuyt 2012年

1
谢谢汤姆。不幸的是,这不是我的应用程序。已邮寄可能链接的人。
理查德·沃森

1
我想看看在这次测试中比较客观化的原因
Moshe Shaham 2014年

18

基于在其他平台上运行这些VM的经验,我想说Java可能会比Python带来更多原始性能。但是,请不要小看Python的卖点:Python语言在代码行方面的生产力要高得多-普遍的共识是,Python需要等效Java程序代码的三分之一,同时保持可读性或可读性。这种优势乘以无需立即进行编译步骤即可立即运行代码的能力。

关于可用的库,您会发现很多扩展的Python运行时库都是现成的(就像Java一样)。AppEngine还支持流行的Django Web框架(http://www.djangoproject.com/)。

关于“电源”,很难理解您的意思,但是Python已在许多不同的领域中使用,尤其是在Web上:YouTube是用Python编写的,Sourceforge也是如此(截至上周)。


谢谢Judy2K!我的意思是,通过力量可以做更多的事情,并且易于扩展。
越南

15

2013年6月:此视频是Google工程师的一个很好的回答:

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

TLDR;是:

  • 选择您和您的团队最能用的语言
  • 如果您想为生产而构建:Java或Python(而非Go)
  • 如果您有一个庞大的团队和一个复杂的代码库:Java(由于静态代码分析和重构)
  • 快速迭代的小型团队:Python(尽管Java也可以)

9

在决定Python和Java之间要考虑的一个重要问题是如何使用每种语言的数据存储(本主题已经很好地涵盖了与原始问题的大多数其他角度)。

对于Java,标准方法是使用JDO或JPA。这些对于可移植性非常有用,但不适用于数据存储。

可以使用低级API,但是对于日常使用而言,该级别太低-它更适合于构建第三方库。

对于Python,有一个专门设计用于向应用程序提供对数据存储的轻松但强大的访问的API。很棒,但是它不是便携式的,因此将您锁定在GAE中。

幸运的是,已经针对两种语言列出的弱点开发了解决方案。

对于Java而言,低级API用于开发持久性库,该持久性库比JDO / JPA(IMO)更适合于数据存储。示例包括Siena项目Objectify

我最近开始使用Objectify,发现它非常易于使用并且非常适合数据存储,并且它的日益普及已经转化为良好的支持。例如,Google的新Cloud Endpoints服务正式支持Objectify。另一方面,Objectify仅适用于数据存储,而Siena受数据存储“启发”,但旨在与各种SQL数据库和NoSQL数据存储一起使用。

对于Python,正在努力允许在GAE之外使用Python GAE数据存储区API。一个示例是Google发布用于SDK的SQLite后端,但我怀疑他们是否打算将其发展为可用于生产的产品。该TyphoonAE项目可能有更多的潜力,但我不认为这是生产准备好了吗或者(纠正我,如果我错了)。

如果任何人有使用这些替代方法的经验或了解其他替代方法,请在评论中添加它们。就我个人而言,我真的很喜欢GAE数据存储-我发现它比AWS SimpleDB有了很大的改进-因此,我希望这些努力的成功能够减轻使用它的一些问题。


7

我强烈推荐Java for GAE,这是为什么:

  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。


1
@Paul-如果不是JDO,您能否推荐(或提供链接)使用Java在GAE上处理持久性的最佳方法?
标记

1
@Mark,很抱歉耽搁。我认为code.google.com/p/objectify-appengine是目前的最佳选择。
保罗2010年

7
-1对于第2点和第3点的完全虚假,对于第4点毫无意义。
三联画

@Triptych,让我知道用于python / GAE的XSLT处理器的名称是什么?对于memcache / python / GAE,相当于CAS(putIfUntouched)操作是什么?
保罗

1
@Paul如果您希望我将这些内容作为答案的一部分,则应将其包括在答案中。相反,您要包含一串半真相。没有人会根据您现在想到的极端情况选择一种语言。
三联画

6

如您所确定的,使用JVM并不限制您使用Java语言。JVM语言和链接的列表可以在这里找到。然而,Google App Engine确实限制了您可以从常规Java SE集中使用的类集,并且您将要研究是否可以在App Engine上使用这些实现中的任何一种。

编辑:我看到你已经找到了这样的列表

我无法评论Python的性能。但是,由于JVM具有在运行时动态编译和优化代码的能力,因此它是一个非常强大的平台性能。

最终,性能将取决于您的应用程序的工作方式以及编码方式。在没有更多信息的情况下,我认为无法在此区域中提供更多的指针。


感谢您的及时答复,布莱恩。我打算将应用程序重点放在URL提取,XML解析和XSLT处理上。提供给浏览器的HTTP内容将更少。
越南

6

我对Python / Django SDK的干净,直接和无问题感到惊讶。但是,我开始遇到需要开始做更多JavaScript的情况,并认为我可能想利用GWT和其他Java实用程序。我只完成了GAE Java教程的一半,却又遇到了一个问题:Eclipse配置问题,JRE版本问题,Java令人麻木的复杂性以及一个令人困惑甚至可能损坏的教程。查看此站点以及从此处链接的其他站点对我来说很重要。我将回到Python,然后研究睡衣以帮助我应对JavaScript挑战。


5

我的谈话有点晚了,但这是我的两分钱。我真的很难在Python和Java之间进行选择,因为我精通两种语言。众所周知,两者都有优点和缺点,您必须考虑自己的要求和最适合您的项目的框架。

像我通常在这种困境中所做的那样,我会寻找数字来支持我的决定。我决定使用Python的原因有很多,但就我而言,有一个情节是临界点。如果您从2014年9月开始在GitHub上搜索“ Google App Engine” ,则会发现下图:

GAE语言统计

这些数字可能有很多偏差,但总的来说,GAE Python存储库的数量是GAE Java存储库的三倍。不仅如此,而且如果按“星数”列出项目,您会看到大多数Python项目都出现在顶部(您必须考虑到Python的使用时间更长)。对我来说,这对于Python来说是一个很好的例子,因为我考虑了社区的采用和支持,文档以及开源项目的可用性。


3

这是一个很好的问题,我认为许多回应都很好地说明了围栏两侧的利弊。我已经尝试了基于Python和基于JVM的AppEngine(以我为例, Gaelyk,它是为AppEngine构建的Groovy应用程序框架)。当谈到平台的性能时,我一直没有想到的一件事就是它一直盯着我,这是在“ Java防护”方面的“加载请求”的含义。使用Groovy时,这些加载请求是致命的。

我在该主题上发表了一篇文章(http://distractable.net/coding/google-appengine-java-vs-python-performance-comparison/),希望找到解决此问题的方法,但是如果不是这样的话,我想我会回到Python + Django的组合,直到冷启动Java请求的影响减小为止。



2

还有一个项目Unladen Swallow,如果不是Google所有,显然是Google资助的。他们正在尝试为Python 2.6.1字节码实现基于LLVM的后端,因此他们可以使用JIT和各种不错的本机代码/ GC /多核优化。(很好的说法:“我们希望不做任何原始工作,而是尽可能多地利用过去30年的研究成果。”)他们正在寻求将CPython的速度提高5倍。

当然,这并不能回答您的紧迫问题,而是指向未来(希望)“缩小差距”(如果有)。


1
Unladen Swallow现在是个失败的项目,最后一次提交已超过一年
tshepang 2011年

2

如今,python的魅力在于它与其他语言的交流程度。例如,您可以使用Jython将python和java放在同一表上。当然,即使jython完全支持Java库,它也不完全支持python库。但是,如果您想弄乱Java库,它是一个理想的解决方案。它甚至允许您将其与Java代码混合使用而无需额外的编码。

但是,即使python本身也已经采取了一些措施。例如,参见ctypes,接近C速度,直接访问C库,而无需离开python编码。Cython更进一步,允许轻松地将c代码与python代码混合,或者即使您不想弄乱c或c ++,您仍然可以在python中进行编码,但使用静态类型变量使python程序与C应用程序一样快。顺便说一下,Cython既被Google使用也受其支持。

昨天我什至发现了用于python内联C或Assembly的工具(请参阅CorePy),您将无法获得比它更强大的功能。

Python当然是一种非常成熟的语言,不仅可以独立存在,而且可以轻松地与任何其他语言配合。我认为,即使在非常高级和苛刻的情况下,这也是使python成为理想解决方案的原因。

使用python,您可以使用几乎零附加的代码访问C / C ++,Java,.NET和许多其他库,从而为您提供一种使代码最小化,简化和美化的语言。这是一种非常诱人的语言。


问题是关于GAE上的Java vs python,它有很多限制。因此,您的论点不适用。
Daniyar

我同意@Daniyar的观点,这个答案有点(或可能完全)不合常规,但我喜欢这个答案,这是我一直在寻找的东西。感谢Kilon共享此知识。可能这是个错误的地方,但是您确实进行了一些知识共享。+1和荣誉。
zeFree 2012年

1

即使GWT对于我正在开发的应用程序来说似乎是一个完美的选择,但Python已经不复存在。JPA在GAE上非常混乱(例如,没有@Embeddable和其他晦涩的未记录限制)。花了一个星期的时间,我可以说Java暂时不适用于GAE。


1

要考虑的是您打算使用的框架。并非Java方面的所有框架都非常适合在App Engine上运行的应用程序,这与传统的Java应用程序服务器有些不同。

要考虑的一件事是应用程序启动时间。使用传统的Java Web应用程序,您实际上不需要考虑这一点。应用程序启动,然后运行。启动时间是5秒钟还是几分钟并不重要。使用App Engine,您可能会遇到仅在请求进入时才启动应用程序的情况。这意味着用户在应用程序启动时正在等待。GAE的新功能(如预留实例)在这里有帮助,但请先检查。

另一件事是GAE对Java的限制不同。并非所有的框架都对可以使用哪些类的限制或不允许使用线程或无法访问本地文件系统的事实感到满意。仅通过搜索GAE兼容性,可能很容易发现这些问题。

我还看到有些人抱怨现代UI框架(即Wicket)上的会话大小问题。通常,这些框架倾向于进行某些折衷,以使开发变得有趣,快速且容易。有时,这可能会导致与App Engine限制冲突。

我最初开始使用Java开发GAE,但由于这些原因,后来切换到Python。我个人的感觉认为Python是App Engine开发的更好选择。我认为Java在Amazon的Elastic Beanstalk上更“居家”。

但是使用App Engine的事情正在发生非常迅速的变化。GAE本身正在发生变化,并且随着它的日益流行,其框架也在发生变化以克服其局限性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.