Choisir Java vs Python sur Google App Engine

161

Actuellement, Google App Engine prend en charge à la fois Python et Java. Le support Java est moins mature. Cependant, Java semble avoir une liste plus longue de bibliothèques et en particulier la prise en charge du bytecode Java, quels que soient les langages utilisés pour écrire ce code. Quelle langue donnera de meilleures performances et plus de puissance? S'il vous plaît donnez votre avis. Je vous remercie!

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

Edit: Par «puissance», j'entends une meilleure extensibilité et une meilleure inclusion des bibliothèques disponibles en dehors du cadre. Cependant, Python n'autorise que des bibliothèques Python pures.

Viet
la source
maintenant Google App Engine prend en charge Go (expérimental). Qu'est-ce que tu as à ce sujet?
Benjamin Crouzier
@pinouchon J'ai commencé à utiliser Go et je l'ai déployé en production sur GAE. GO fonctionne très bien sur GAE, compile en quelques secondes. Choisissez judicieusement votre framework web :-)
Michele Giuseppe Fadda

Réponses:

123

Je suis partial (étant un expert Python mais assez rouillé en Java) mais je pense que le runtime Python de GAE est actuellement plus avancé et mieux développé que le runtime Java - le premier a eu un an supplémentaire pour se développer et mûrir, après tout .

Il est bien sûr difficile de prévoir la manière dont les choses se passeront à l'avenir - la demande est probablement plus forte du côté Java (d'autant plus qu'il ne s'agit pas seulement de Java, mais aussi d'autres langages perchés au-dessus de la JVM, donc c'est LA façon d'exécuter par exemple PHP ou code Ruby sur App Engine); L'équipe Python App Engine a cependant l'avantage d'avoir à bord Guido van Rossum, l'inventeur de Python et un ingénieur incroyablement fort.

En termes de flexibilité, le moteur Java, comme déjà mentionné, offre la possibilité d'exécuter un bytecode JVM créé par différents langages, pas seulement Java - si vous êtes dans une boutique multilingue, c'est un avantage assez important. Vice versa, si vous détestez Javascript mais devez exécuter du code dans le navigateur de l'utilisateur, le GWT de Java (générant le Javascript pour vous à partir de votre codage au niveau Java) est beaucoup plus riche et plus avancé que les alternatives côté Python (en pratique, si vous choisissez Python, vous allez écrire vous-même du JS à cette fin, tandis que si vous choisissez Java, GWT est une alternative utilisable si vous détestez écrire JS).

En termes de bibliothèques, c'est à peu près un lavage - la JVM est suffisamment restreinte (pas de threads, pas de chargeur de classe personnalisé, pas de JNI, pas de base de données relationnelle) pour entraver la simple réutilisation des bibliothèques Java existantes autant, voire plus, que Python existant Les bibliothèques sont également gênées par les restrictions similaires sur le runtime Python.

En termes de performances, je pense que c'est un lavage, même si vous devriez vous comparer à vos propres tâches - ne vous fiez pas aux performances des implémentations JVM hautement optimisées basées sur JIT en réduisant leurs temps de démarrage et leur empreinte mémoire importants, car le moteur d'application l'environnement est très différent (les coûts de démarrage seront souvent payés, car les instances de votre application sont démarrées, arrêtées, déplacées vers différents hôtes, etc., le tout de manière transparente pour vous - de tels événements sont généralement beaucoup moins chers avec les environnements d'exécution Python qu'avec les JVM).

La situation XPath / XSLT (pour être euphémique ...) n'est pas exactement parfaite de chaque côté, soupir, même si je pense que cela peut être un peu moins mauvais dans la JVM (où, apparemment, des sous-ensembles substantiels de Saxon peuvent être exécutés , avec une certaine prudence). Je pense que cela vaut la peine d'ouvrir des problèmes sur la page Appengine Issues avec XPath et XSLT dans leurs titres - pour le moment, il n'y a que des problèmes demandant des bibliothèques spécifiques, et c'est myope: je ne me soucie pas vraiment de la façon dont un bon XPath / XSLT est implémenté, pour Python et / ou pour Java, tant que je peux l'utiliser. (Des bibliothèques spécifiques peuvent faciliter la migration du code existant, mais c'est moins important que de pouvoir effectuer des tâches telles que "appliquer rapidement la transformation XSLT" de quelque manière! -). Je sais que je serais la vedette d'un tel problème s'il était bien formulé (en particulier d'une manière indépendante de la langue).

Dernier point mais non le moindre: rappelez-vous que vous pouvez avoir différentes versions de votre application (en utilisant le même magasin de données) dont certaines sont implémentées avec le runtime Python, d'autres avec le runtime Java, et vous pouvez accéder à des versions qui diffèrent de "default / active "un avec des URL explicites. Ainsi, vous pouvez faire en sorte que le code Python et Java (dans différentes versions de votre application) utilise et modifie le même magasin de données, vous offrant encore plus de flexibilité (même si un seul aura la "belle" URL telle que foobar.appspot.com - ce qui n'est probablement important que pour l'accès des utilisateurs interactifs sur les navigateurs, j'imagine ;-)

Alex Martelli
la source
9
GWT est principalement une technologie côté client - vous pouvez l'utiliser indépendamment du fait que votre back-end soit python ou java. Vous perdez un peu de sucre syntaxique en ayant à faire du rpc sur JSON plutôt que le RPC intégré de GWT, mais si vous détestez JS et faites du python, cela vaut
quand
9
Il y a Pyjamas ( pyjs.org ) comme alternative Pythonic à GWT - il prendra du code Python et le compilera en Javascript, tout comme GWT le fait pour le code Java.
Dave Kirby
7
Juste pour donner une perspective «5 ans plus tard». En tant que développeur Java, j'ai l'impression que GAE exécute une pile obsolète. Vous ne trouverez pas de support Java 8 ( ils exécutent Java 6 ainsi que l'ancien conteneur Jetty 6 avec Servlet API 2.5 ), dans l'ensemble, le support Java dans GAE est toujours bloqué en 2010. Bien que j'adore la simplicité GAE et Google Powerful Services, Je ne peux pas recommander GAE pour Java tant qu'ils n'ont pas mis à niveau sa pile.
Anthony Accioly
72

Regardez cette application pour les changements dans les performances de Python et Java:

http://gaejava.appspot.com/ (modifier: excuses, le lien est cassé maintenant. Mais le paragraphe suivant est toujours appliqué quand je l'ai vu en dernier)

Actuellement, Python et l'utilisation de l'API de bas niveau en Java sont plus rapides que JDO sur Java, pour ce test simple . Au moins si le moteur sous-jacent change, cette application doit refléter les changements de performances.

Richard Watson
la source
5
Avec tout le respect que je vous dois, je trouve ce test assez simple pour être dénué de sens. Pour ce que ça vaut ... Si vous utilisez Java / GAE, je recommande d'utiliser l'API de bas niveau et d'éviter JDO ou tout autre framework. Plus important encore, JDO vous donne le «sentiment» que vous travaillez avec une base de données relationnelle, ce qui peut être «trompeur».
Mo'in Creemers du
1
Je suis d'accord pour éviter JDO, en partie pour la raison que vous mentionnez mais aussi parce que c'est plus lent que le bas niveau. (Ce que le test montre généralement.) Cela indique simplement qu'il existe des différences de performances, donc n'utilisez pas JDO ou ne testez pas votre tâche spécifique. J'ai déplacé tout mon propre code de JDO et de l'API de bas niveau vers Objectify. Et dans tous les cas, cela montre également que Python n'est certainement pas le cousin pauvre des performances sur GAE.
Richard Watson
1
Votre application lance une erreur de serveur interne.
tomdemuyt
1
Merci Tom. Pas mon application, malheureusement. Avoir envoyé un mail à quelqu'un qui pourrait être lié.
Richard Watson
1
Je voudrais voir comment objectify se compare dans ce test
Moshe Shaham
18

Basé sur l'expérience de l'exécution de ces machines virtuelles sur d'autres plates-formes, je dirais que vous obtiendrez probablement plus de performances brutes de Java que de Python. Cependant, ne sous-estimez pas les arguments de vente de Python: le langage Python est beaucoup plus productif en termes de lignes de code - l'accord général est que Python nécessite un tiers du code d'un programme Java équivalent, tout en restant au moins plus lisible. Cet avantage est multiplié par la possibilité d'exécuter du code immédiatement sans étape de compilation explicite.

En ce qui concerne les bibliothèques disponibles, vous constaterez qu'une grande partie de la vaste bibliothèque d'exécution Python fonctionne hors de la boîte (tout comme Java). Le framework Web Django populaire ( http://www.djangoproject.com/ ) est également pris en charge sur AppEngine.

En ce qui concerne le «pouvoir», il est difficile de savoir ce que vous voulez dire, mais Python est utilisé dans de nombreux domaines différents, en particulier le Web: YouTube est écrit en Python, tout comme Sourceforge (depuis la semaine dernière).

Judy2K
la source
Merci Judy2K! Par puissance, je veux dire peut faire plus de choses et être facile à étendre.
Viet
15

Juin 2013: Cette vidéo est une très bonne réponse d'un ingénieur Google:

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

TLDR; est:

  • Choisissez la langue avec laquelle vous et votre équipe êtes le plus productif
  • Si vous voulez créer quelque chose pour la production: Java ou Python (pas Go)
  • Si vous avez une grande équipe et une base de code complexe: Java (en raison de l'analyse et du refactoring de code statique)
  • Petites équipes qui itèrent rapidement: Python (bien que Java soit également correct)
Bijan
la source
9

Une question importante à considérer pour décider entre Python et Java est de savoir comment vous utiliserez le magasin de données dans chaque langage (et la plupart des autres angles de la question d'origine ont déjà été assez bien traités dans cette rubrique).

Pour Java , la méthode standard consiste à utiliser JDO ou JPA. Ils sont parfaits pour la portabilité mais ne sont pas très bien adaptés à la banque de données.

Une API de bas niveau est disponible, mais ce niveau est trop bas pour une utilisation quotidienne - elle est plus adaptée à la création de bibliothèques tierces.

Pour Python, il existe une API conçue spécifiquement pour fournir aux applications un accès facile mais puissant à la banque de données. C'est génial sauf qu'il n'est pas portable, donc il vous verrouille dans GAE.

Heureusement, des solutions sont en cours de développement pour les faiblesses répertoriées pour les deux langues.

Pour Java , l'API de bas niveau est utilisée pour développer des bibliothèques de persistance bien mieux adaptées au magasin de données que JDO / JPA (IMO). Les exemples incluent le projet Siena et Objectify .

J'ai récemment commencé à utiliser Objectify et je trouve qu'il est très facile à utiliser et bien adapté au magasin de données, et sa popularité croissante s'est traduite par un bon support. Par exemple, Objectify est officiellement pris en charge par le nouveau service Cloud Endpoints de Google. D'autre part, Objectify ne fonctionne qu'avec la banque de données, tandis que Sienne est «inspirée» par la banque de données, mais est conçue pour fonctionner avec une variété de bases de données SQL et de banques de données NoSQL.

Pour Python , des efforts sont déployés pour permettre l'utilisation de l'API du magasin de données Python GAE hors du GAE. Un exemple est le backend SQLite que Google a publié pour être utilisé avec le SDK, mais je doute qu'ils aient l'intention de devenir quelque chose de prêt pour la production. Le projet TyphoonAE a probablement plus de potentiel, mais je ne pense pas qu'il soit encore prêt pour la production (corrigez-moi si je me trompe).

Si quelqu'un a de l'expérience avec l'une de ces alternatives ou en connaît d'autres, veuillez les ajouter dans un commentaire. Personnellement, j'aime beaucoup la banque de données GAE - je trouve que c'est une amélioration considérable par rapport à AWS SimpleDB - donc je souhaite le succès de ces efforts pour atténuer certains des problèmes liés à son utilisation.

À M
la source
7

Je recommande fortement Java pour GAE et voici pourquoi:

  1. Performances: Java est potentiellement plus rapide que Python.
  2. Le développement de Python est sous la pression d'un manque de bibliothèques tierces. Par exemple, il n'y a pas du tout de XSLT pour Python / GAE. Presque toutes les bibliothèques Python sont des liaisons C (et celles-ci ne sont pas prises en charge par GAE).
  3. API Memcache: le SDK Java a des capacités plus intéressantes que le SDK Python.
  4. API Datastore: JDO est très lent, mais l'API native Java datastore est très rapide et facile.

J'utilise Java / GAE en développement en ce moment.

Paul
la source
1
@Paul - pourriez-vous recommander (ou donner des liens vers) la meilleure façon de gérer la persistance en utilisant Java sur GAE si JDO n'est pas la voie à suivre?
Mark
1
@Mark, je suis désolé pour le retard. Je pense que code.google.com/p/objectify-appengine est le meilleur choix pour le moment.
Paul
7
-1 pour les faussetés flagrantes aux points 2 et 3 et pour le n ° 4 qui n'ont aucun sens.
Triptyque du
@Triptych, laissez-moi savoir quel est le nom du processeur XSLT pour python / GAE? Et quel est l'équivalent de l'opération CAS (putIfUntouched) pour memcache / python / GAE?
Paul
1
@Paul si vous vouliez que je considère ces choses dans le cadre de votre réponse, vous auriez dû les inclure dans votre réponse. Au lieu de cela, vous incluez une série de demi-vérités. Personne ne choisit une langue en fonction des cas de coin que vous proposez maintenant.
Triptyque du
6

Comme vous l'avez identifié, l'utilisation d'une JVM ne vous limite pas à l'utilisation du langage Java. Une liste des langues et des liens JVM est disponible ici . Cependant , Google App Engine restreint l'ensemble de classes que vous pouvez utiliser à partir de l'ensemble Java SE normal, et vous voudrez vérifier si l'une de ces implémentations peut être utilisée sur le moteur d'application.

EDIT: je vois que vous avez trouvé une telle liste

Je ne peux pas faire de commentaire sur les performances de Python. Cependant, la JVM est une plate-forme très puissante en termes de performances, compte tenu de sa capacité à compiler et à optimiser dynamiquement le code pendant l'exécution.

En fin de compte, les performances dépendront de ce que fait votre application et de la façon dont vous la codez. En l'absence d'informations supplémentaires, je pense qu'il n'est pas possible de donner plus d'indications dans ce domaine.

Brian Agnew
la source
Merci pour la réponse rapide, Brian. J'ai l'intention de concentrer l'application sur la récupération d'url et l'analyse XML et le traitement XSLT. Il y aura moins de contenu HTTP aux navigateurs.
Viet
6

J'ai été étonné de voir à quel point le SDK Python / Django est propre, simple et sans problème. Cependant, j'ai commencé à rencontrer des situations où je devais commencer à faire plus de JavaScript et j'ai pensé que je pourrais vouloir profiter de GWT et d'autres utilitaires Java. Je suis arrivé à mi-chemin du didacticiel GAE Java et j'ai eu un problème après l'autre: des problèmes de configuration d'Eclipse, une version JRE, la complexité stupéfiante de Java et un didacticiel déroutant et peut-être cassé. La vérification de ce site et d'autres liens à partir d'ici m'a permis de le découvrir. Je retourne à Python et je vais examiner Pyjamas pour vous aider à relever mes défis JavaScript.

mjhm
la source
5

Je suis un peu en retard à la conversation, mais voici mes deux cents. J'ai vraiment eu du mal à choisir entre Python et Java, car je connais bien les deux langues. Comme nous le savons tous, il y a des avantages et des inconvénients pour les deux, et vous devez prendre en compte vos exigences et les cadres qui fonctionnent le mieux pour votre projet.

Comme je le fais habituellement dans ce type de dilemmes, je recherche des chiffres pour appuyer ma décision. J'ai décidé d'utiliser Python pour de nombreuses raisons, mais dans mon cas, il y avait un complot qui a été le point de basculement. Si vous recherchez "Google App Engine" dans GitHub à partir de septembre 2014 , vous trouverez le chiffre suivant:

Statistiques de langue GAE

Il pourrait y avoir de nombreux biais dans ces chiffres, mais dans l'ensemble, il y a trois fois plus de référentiels GAE Python que de référentiels GAE Java. Non seulement cela, mais si vous listez les projets par le "nombre d'étoiles", vous verrez qu'une majorité des projets Python apparaissent en haut (vous devez prendre en compte que Python existe depuis plus longtemps). Pour moi, cela constitue un argumentaire fort pour Python car je prends en compte l'adoption et le support par la communauté, la documentation et la disponibilité des projets open source.

Jaime Ivan Cervantes
la source
3

C'est une bonne question, et je pense que bon nombre des réponses ont donné de bons points de vue sur les avantages et les inconvénients des deux côtés de la clôture. J'ai essayé à la fois AppEngine basé sur Python et JVM (dans mon cas, j'utilisais Gaelyk qui est un framework d'application Groovy conçu pour AppEngine). En ce qui concerne les performances sur la plate-forme, une chose que je n'avais pas envisagée avant de me regarder en face est l'implication des «requêtes de chargement» qui se produisent du côté Java de la clôture. Lorsque vous utilisez Groovy, ces demandes de chargement sont mortelles.

J'ai rédigé un article sur le sujet ( http://distractable.net/coding/google-appengine-java-vs-python-performance-comparison/ ) et j'espère trouver un moyen de contourner le problème, mais sinon, je pense que je vais revenir à une combinaison Python + Django jusqu'à ce que le démarrage à froid des requêtes java ait moins d'impact.

Damon Oehlman
la source
3

Sur la base de combien j'entends les gens de Java se plaindre d'AppEngine par rapport aux utilisateurs de Python, je dirais que Python est beaucoup moins stressant à utiliser.

Noah McIlraith
la source
7
J'ai entendu dire que les propriétaires de Ford se plaignent beaucoup plus de leurs voitures que les propriétaires de Koenigsegg. Pourquoi est-ce possible?
Axarydax
2

Il y a aussi le projet Unladen Swallow , qui est apparemment financé par Google s'il ne lui appartient pas. Ils essaient d'implémenter un backend basé sur LLVM pour le bytecode Python 2.6.1, afin qu'ils puissent utiliser un JIT et diverses optimisations de code natif / GC / multicœur. (Belle citation: "Nous aspirons à ne faire aucun travail original, à la place en utilisant autant que possible des 30 dernières années de recherche.") Ils recherchent une accélération 5x vers CPython.

Bien sûr, cela ne répond pas à votre question immédiate, mais indique une "fermeture de l'écart" (le cas échéant) à l'avenir (espérons-le).

synchromesh
la source
1
Unladen Swallow est maintenant un projet mort et le dernier commit a plus d'un an .
tshepang
2

La beauté de python de nos jours est sa capacité à communiquer avec d'autres langues. Par exemple, vous pouvez avoir à la fois python et java sur la même table avec Jython. Bien sûr, jython, même s'il prend entièrement en charge les bibliothèques java, il ne prend pas entièrement en charge les bibliothèques python. Mais c'est une solution idéale si vous voulez jouer avec les bibliothèques Java. Il vous permet même de le mélanger avec du code Java sans codage supplémentaire.

Mais même python lui-même a fait quelques pas en avant. Voir les ctypes par exemple, près de la vitesse C, accéder directement aux bibliothèques C tout cela sans quitter le confort du codage python. Cython va plus loin, permettant de mélanger facilement du code c avec du code python, ou même si vous ne voulez pas jouer avec c ou c ++, vous pouvez toujours coder en python mais utiliser des variables de type statique rendant vos programmes python aussi rapides que les applications C . Cython est à la fois utilisé et pris en charge par google.

Hier, j'ai même trouvé des outils pour python pour inline C ou même Assembly (voir CorePy), vous ne pouvez pas être plus puissant que cela.

Python est sûrement un langage très mature, non seulement autonome, mais capable de coopérer avec n'importe quel autre langage avec easy. Je pense que c'est ce qui fait de python une solution idéale même dans des scénarios très avancés et exigeants.

Avec python, vous pouvez accéder à C / C ++, Java, .NET et à de nombreuses autres bibliothèques avec presque aucun codage supplémentaire, ce qui vous donne également un langage qui minimise, simplifie et embellit le codage. C'est une langue très tentante.

kilon
la source
La question concerne java vs python sur GAE, qui comporte de nombreuses restrictions. Par conséquent, vos arguments sont inapplicables.
Daniyar
Je suis d'accord avec @Daniyar, que cette réponse est un peu (ou peut-être totalement) décalée, mais j'aime la réponse et c'est quelque chose que je cherchais. Merci Kilon pour le partage de ces connaissances. Ce n'était peut-être pas le bon endroit, mais vous avez certainement fait un partage de connaissances. +1 et bravo pour cela.
zeFree
1

Fini avec Python même si GWT semble correspondre parfaitement au type d'application que je développe. JPA est assez foiré sur GAE (par exemple, pas de @Embeddable et d'autres limitations obscures non documentées). Après avoir passé une semaine, je peux dire que Java ne se sent tout simplement pas bien sur GAE pour le moment.

Yanchenko
la source
1

Il faut tenir compte des frameworks que vous comptez utiliser. Tous les frameworks côté Java ne sont pas bien adaptés aux applications exécutées sur App Engine, ce qui est quelque peu différent des serveurs d'applications Java traditionnels.

Une chose à considérer est le temps de démarrage de l'application. Avec les applications Web Java traditionnelles, vous n'avez pas vraiment besoin de penser à cela. L'application démarre, puis elle s'exécute. Peu importe si le démarrage prend 5 secondes ou quelques minutes. Avec App Engine, vous pouvez vous retrouver dans une situation où l'application n'est démarrée que lorsqu'une demande arrive. Cela signifie que l'utilisateur attend le démarrage de votre application. Les nouvelles fonctionnalités GAE telles que les instances réservées sont utiles ici, mais vérifiez d'abord.

Une autre chose est les différentes limitations psoes GAE sur Java. Tous les frameworks ne sont pas satisfaits des limitations sur les classes que vous pouvez utiliser ou du fait que les threads ne sont pas autorisés ou que vous ne pouvez pas accéder au système de fichiers local. Ces problèmes sont probablement faciles à découvrir en recherchant simplement la compatibilité GAE sur Google.

J'ai également vu des personnes se plaindre de problèmes de taille de session sur des cadres d'interface utilisateur modernes (Wicket, à savoir). En général, ces frameworks ont tendance à faire certains compromis afin de rendre le développement amusant, rapide et facile. Cela peut parfois entraîner des conflits avec les limitations d'App Engine.

J'ai d'abord commencé à développer en travaillant sur GAE avec Java, puis je suis passé à Python pour ces raisons. Mon sentiment personnel est que Python est un meilleur choix pour le développement App Engine. Je pense que Java est plus "à la maison" par exemple sur Elastic Beanstalk d'Amazon.

MAIS avec App Engine, les choses évoluent très rapidement. GAE est en train de changer et à mesure qu'il devient plus populaire, les cadres changent également pour contourner ses limites.

Juha Palomäki
la source