在Google App Engine上selectJava vs Python

目前Google App Engine支持Python和Java。 Java支持不太成熟。 但是,Java似乎有更长的库列表,特别是对Java字节码的支持,而不pipe用于编写代码的语言如何。 哪种语言能够提供更好的性能和更强的动力? 请指教。 谢谢!

编辑: http : //groups.google.com/group/google-appengine-java/web/will-it-play-in-app-engine?pli=1

编辑: “权力”我的意思是更好的可扩展性和框架之外的可用库。 Python只允许使用纯Python库。

我有偏见(作为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方法更丰富和更先进(实际上,如果您selectPython,你会为了这个目的而自己编写一些JS,而如果你selectJava GWT,如果你不喜欢写JS的话,那么它是一个可用的select)。

从库的angular度来说,它是非常有用的–JVM具有足够的局限性(没有线程,没有自定义的类加载器,没有JNI,没有关系数据库)阻碍了现有Java库的简单重用,甚至比现有的Python类库也受到类似的Python运行时限制的阻碍。

就性能而言,我认为这是一个洗牌,尽pipe您应该对自己的任务进行基准testing – 不要依赖高度优化的基于JIT的JVM实现的性能,因为它们的启动时间和内存占用较大,因为应用程序引擎环境是非常不同的(启动成本将经常支付,因为您的应用程序的实例开始,停止,移动到不同的主机等等,所有这些事情对于Python运行时环境来说比JVM要便宜得多)。

XPath / XSLT的情况(是委婉的…)并不是完美的两面,感叹,虽然我认为在JVM中可能不那么糟糕(显然,撒克逊的大部分子集可以运行,小心点)。 我认为值得在Appengine Issues页面上打开XPath和XSLT标题上的问题 – 现在只有问题需要特定的库,这是近视的:我并不在意如何实现一个好的XPath / XSLT,对于Python和/或Java,只要我可以使用它。 (特定的库可以简化现有代码的迁移,但是这比以某种方式执行诸如“快速应用XSLT转换”这样的任务更为重要! 我知道,如果描述得很好,尤其是以一种与语言无关的方式来expression这样的问题。

最后但并非最不重要:请记住,您可以使用不同版本的应用程序(使用相同的数据存储),其中一些使用Python运行时实现,一些使用Java运行时,您可以访问与“default / active “一个具有明确的URL。 因此,您可以同时使用Python Java代码(在您的应用程序的不同版本中)使用和修改相同的数据存储,从而赋予您更多的灵活性(尽pipe只有一个具有“漂亮”的url,例如foobar.appspot.com -这可能仅对交互式用户访问浏览器很重要,我想;-)。

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

http://gaejava.appspot.com/ (编辑:道歉,链接现在被打破,但是当我看到它继续运行时,下面的para仍然被应用)

目前, 对于这个简单的testing ,Python和使用Java中的低级API比Java上的JDO更快。 至less如果底层引擎发生变化,那么这个应用程序应该反映性能的变化

根据在其他平台上运行这些虚拟机的经验,我会说,你可能会得到比Java更多的原始性能。 但是,不要低估Python的卖点:Python语言在代码行方面的效率要高得多 – 一般认为Python需要相当于Java程序的三分之一的代码,同时保持可读性。 这个好处被乘以运行代码的能力,而不需要明确的编译步骤。

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

关于“权力”,很难知道你的意思,但Python被用于许多不同的领域,特别是networking:YouTube是用Python编写的,就像Sourceforge(截至上周)一样。

2013年6月:这个video是谷歌工程师给出的非常好的答案:

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

TLDR; 是:

  • select你和你的团队最有效的语言
  • 如果你想为生产构build一些东西:Java或者Python(而不是Go)
  • 如果你有一个庞大的团队和复杂的代码库:Java(由于静态代码分析和重构)
  • 小团队快速迭代:Python(尽pipeJava也可以)

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

对于Java ,标准方法是使用JDO或JPA。 这对于可移植性来说是很好的,但是不太适合数据存储。

一个低级的API是可用的,但这对于日常使用来说太低级 – 它更适合于构build第三方库。

对于Python,有一个专门为应用程序提供简单而强大的数据存储访问的API。 这是伟大的,但它不是便携式,所以它locking你GAE。

幸运的是,正在为这两种语言列出的弱点开发解决scheme。

对于Java而言 ,低级API正在被用于开发更适合JDO / JPA(IMO)数据存储的持久性库。 例子包括锡耶纳项目和Objectify 。

我最近开始使用Objectify,并发现它非常易于使用,非常适合数据存储,并且越来越受欢迎已经转化为良好的支持。 例如,Objectify由Google新的云端点服务正式支持。 另一方面,Objectify仅适用于数据存储,而Siena受数据存储“启发”,但是devise用于与各种SQL数据库和NoSQL数据存储一起使用。

对于Python ,我们正在努力使GAE数据存储API的使用脱离GAE。 一个例子是Google发布的用于SDK的SQLite后端,但是我怀疑他们是否打算将这种后端扩展到生产环境。 TyphoonAE项目可能有更多的潜力,但是我认为它还没有生产准备好(如果我错了,请纠正我)。

如果任何人有任何这些替代scheme的经验或知道他人,请添加他们的评论。 就我个人而言,我真的很喜欢GAE数据存储 – 我发现它比AWS SimpleDB有了相当大的改进 – 所以我希望这些努力的成功,以减轻使用它的一些问题。

正如您已经确定的那样,使用JVM并不限制您使用Java语言。 JVM语言和链接的列表可以在这里find。 但是 ,Google App Engine会限制可以从普通Java SE集中使用的一组类,并且您需要调查这些实现是否可以在应用程序引擎上使用。

编辑:我看到你已经find了这样一个列表

我无法评论Python的性能。 然而,由于JVM在运行时dynamic编译和优化代码的能力,JVM在性能方面是非常强大的平台。

最终性能将取决于您的应用程序的function,以及如何编码。 在没有进一步的信息的情况下,我认为不可能在这个领域再提出一些build议。

我很惊讶Python / Django SDK是干净,简单,无问题的。 然而,我开始遇到需要开始使用更多JavaScript的情况,并认为我可能想要利用GWT和其他Java实用程序。 我已经在GAE Java教程中获得了一半,并且遇到了一个又一个的问题:Eclipseconfiguration问题,JRE版本问题,Java令人头脑麻木的复杂性,以及一个令人困惑和可能破坏的教程。 检查出这个网站和其他链接从这里抓住了我。 我要回到Python,我会研究睡衣,以帮助我的JavaScript挑战。

我强烈推荐Java for GAE,原因如下:

  1. 性能:Java可能比Python更快。
  2. Python开发受到缺乏第三方库的压力。 例如,Python / GAE根本就没有XSLT。 几乎所有的Python库都是C绑定的(这些都不被GAE支持)。
  3. Memcache API:Java SDK比Python SDK有更多有趣的function。
  4. Datastore API:JDO速度非常慢,但本地Java数据存储API非常快速和简单。

我正在开发中使用Java / GAE。

我谈话有点迟,但这是我的两分钱。 我真的很难在Python和Java之间进行select,因为我非常熟悉这两种语言。 众所周知,两者都有其优点和缺点,您必须考虑您的需求和最适合您项目的框架。

就像我通常在这种困境中所做的那样,我会寻找数字来支持我的决定。 我决定和Python合作的原因很多,但就我而言,有一个情节是引爆点。 如果您从2014年9月起在GitHub中search“Google App Engine”,则会看到下图:

GAE语言统计

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

这是一个很好的问题,我想很多的回答都是围绕篱笆两侧的优点和缺点提出的。 我已经尝试了Python和基于JVM的AppEngine(在我的例子中,我使用的是Gaelyk ,它是为AppEngine构build的Groovy应用程序框架)。 当谈到平台上的性能时,有一件事情我没有考虑到,直到它在我面前盯着我看,就是在栅栏的Java端发生的“加载请求”的含义。 使用Groovy时,这些加载请求是一个杀手。

我把这个主题放在一起( http://distractable.net/coding/google-appengine-java-vs-python-performance-comparison/ ),我希望能find解决这个问题的方法,但是如果没有,我想我会回到一个Python + Django组合,直到冷启动Java请求没有什么影响。

根据我听到有多lessJava用户抱怨AppEngine与Python用户相比,我会说Python的使用压力要小得多。

还有一个项目是Unladen Swallow ,如果不是Google拥有的话,这个项目显然是由Google资助的。 他们试图为Python 2.6.1字节码实现基于LLVM的后端,这样他们就可以使用JIT和各种不错的本机代码/ GC /多核优化。 (很好的引用:“我们希望不做原创的工作,而不是使用尽可能多的过去30年的研究。”)他们正在寻找CPython的5倍加速。

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

python现在的美妙之处在于它与其他语言的沟通。 例如,您可以在Jython的同一个表上同时使用python和java。 当然,即使jython完全支持java库,它也不支持完整的python库。 但是如果你想搞乱Java库的话,它是一个理想的解决scheme。 它甚至可以让你把它与Java代码混合在一起,而不需要额外的编码。

但即使python本身也已经采取了一些措施。 看ctypes例如,接近C的速度,直接join到C库的所有这一切,而不必离开python编码的舒适。 Cython更进一步,允许轻松地将c代码与Python代码混合在一起,或者即使您不想混淆c或c ++,仍然可以使用python编写代码,但是使用静态typesvariables使您的python程序与C应用程序一样快。 Cython是顺便使用和支持的谷歌。

昨天我甚至发现了python的工具来内联C甚至是Assembly(见CorePy),你不能得到比这更强大的function。

Python肯定是一种非常成熟的语言,不仅站在自己的身边,而且还能够轻松地与任何其他语言合作。 我认为,即使在非常先进和苛刻的情况下,python也是理想的解决scheme。

使用python,你可以获得C / C ++,Java,.NET和其他许多库,几乎不需要额外的编码,从而为你提供了一种最小化,简化和美化编码的语言。 这是一个非常诱人的语言。

尽pipeGWT似乎与我正在开发的一种应用程序完美匹配,但是用了Python。 JPA在GAE上相当混乱(例如没有@Embeddable和其他不明确的未logging的限制)。 花了一个星期的时间,我可以说Java现在对GAE感觉不太好。

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

有一件事要考虑的是应用程序的启动时间。 使用传统的Java Web应用程序,您并不需要考虑这一点。 应用程序启动,然后运行。 如果启动需要5秒钟或几分钟,则无关紧要。 使用App Engine时,最终只会在请求进入时才启动应用程序。这意味着用户在应用程序启动时正在等待。 新的GAEfunction,如保留实例帮助在这里,但首先检查。

另一件事是在Java上的GAE psoes的不同限制。 并不是所有的框架都对你可以使用什么类的限制或线程不被允许或者你不能访问本地文件系统的限制感到满意。 这些问题可能很容易通过searchGAE兼容性find。

我也看到一些人在现代UI框架(Wicket)上抱怨会话大小的问题。 总的来说,这些框架倾向于做一定的权衡,以使开发变得有趣,快速和简单。 有时这可能会导致与App Engine限制发生冲突。

我最初开始使用Java开发GAE,但之后因为这些原因转而使用Python。 我个人的感觉是,Python是App Engine开发的更好select。 我认为Java在Amazon的Elastic Beanstalk上比较“在家”。

与App Engine的事情正在改变非常迅速。 GAE正在发生变化,随着它越来越受欢迎,框架也在变化,以解决其局限性。