Escolhendo Java vs Python no Google App Engine

161

Atualmente, o Google App Engine suporta Python e Java. O suporte a Java é menos maduro. No entanto, Java parece ter uma lista mais longa de bibliotecas e, especialmente, suporte para bytecode Java, independentemente das linguagens usadas para escrever esse código. Qual idioma fornecerá melhor desempenho e mais poder? Por favor informar. Obrigado!

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

Edit: Por "poder", quero dizer melhor capacidade de expansão e inclusão de bibliotecas disponíveis fora da estrutura. O Python permite apenas bibliotecas Python puras.

Viet
fonte
agora o Google App Engine oferece suporte ao Go (experimental). Qual é a sua opinião sobre isso?
Benjamin Crouzier 15/07
@pinouchon Comecei a usar o Go e implantei isso em produção no GAE. GO funciona muito bem no GAE, compila em alguns segundos. Escolha o seu framework web sabiamente :-)
Michele Giuseppe Fadda

Respostas:

123

Sou tendencioso (sendo um especialista em Python, mas bastante enferrujado em Java), mas acho que o tempo de execução Python do GAE atualmente é mais avançado e melhor desenvolvido do que o tempo de execução Java - o primeiro teve mais um ano para desenvolver e amadurecer, afinal .

Naturalmente, é difícil prever como as coisas vão progredir - a demanda provavelmente é mais forte no lado do Java (especialmente porque não se trata apenas de Java, mas de outras linguagens que também estão na parte superior da JVM, é a maneira de executar, por exemplo, PHP ou código Ruby no App Engine); a equipe do Python App Engine, no entanto, tem a vantagem de ter Guido van Rossum, o inventor do Python e um engenheiro incrivelmente forte.

Em termos de flexibilidade, o mecanismo Java, como já mencionado, oferece a possibilidade de executar o bytecode da JVM feito por diferentes linguagens, não apenas o Java - se você estiver em uma loja multilíngue, é um grande positivo. Vice-versa, se você detesta o Javascript, mas precisa executar algum código no navegador do usuário, o GWT do Java (gerando o Javascript para você a partir da codificação no nível do Java) é muito mais rico e avançado do que as alternativas do lado do Python (na prática, se você escolher Python, você mesmo escreverá algumas JS para esse fim, enquanto que se escolher Java GWT é uma alternativa utilizável se detestar escrever JS).

Em termos de bibliotecas, é praticamente uma lavagem - a JVM é restrita o suficiente (sem encadeamentos, sem carregadores de classes personalizados, sem JNI, sem banco de dados relacional) para dificultar a reutilização simples das bibliotecas Java existentes tanto quanto mais do que o Python existente bibliotecas são igualmente impedidas pelas restrições semelhantes no tempo de execução do Python.

Em termos de desempenho, acho que é uma lavagem, embora você deva avaliar suas próprias tarefas - não confie no desempenho de implementações de JVM baseadas em JIT altamente otimizadas, descontando seus grandes tempos de inicialização e pegadas de memória, porque o mecanismo de aplicativo o ambiente é muito diferente (os custos de inicialização serão pagos com frequência, à medida que as instâncias do seu aplicativo são iniciadas, paradas, movidas para hosts diferentes, etc., tudo isso para você - esses eventos geralmente são muito mais baratos nos ambientes de tempo de execução Python do que nas JVMs).

A situação XPath / XSLT (para ser eufemística ...) não é exatamente perfeita de nenhum lado, suspiro, embora eu ache que pode ser um pouco menos ruim na JVM (onde, aparentemente, subconjuntos substanciais de saxão podem ser executados , com algum cuidado). Acho que vale a pena abrir problemas na página Appengine Issues com XPath e XSLT em seus títulos - no momento, existem apenas problemas solicitando bibliotecas específicas, e isso é míope: eu realmente não me importo com o modo como um bom XPath / XSLT é implementado, para Python e / ou Java, desde que eu possa usá-lo. (Bibliotecas específicas podem facilitar a migração do código existente, mas isso é menos importante do que ser capaz de executar tarefas como "aplicar rapidamente a transformação XSLT" de alguma maneira! -). Sei que estrelaria esse problema se fosse bem formulado (especialmente de maneira independente do idioma).

Por último, mas não menos importante: lembre-se de que você pode ter uma versão diferente do seu aplicativo (usando o mesmo armazenamento de dados), alguns dos quais são implementados com o tempo de execução do Python, outros com o tempo de execução do Java e é possível acessar versões diferentes do "padrão / ativo" "um com URLs explícitos. Assim, você pode fazer com que os códigos Python e Java (em versões diferentes do seu aplicativo) usem e modifiquem o mesmo repositório de dados, concedendo a você ainda mais flexibilidade (embora apenas um tenha o URL "legal", como foobar.appspot.com - o que provavelmente é importante apenas para o acesso de usuários interativos nos navegadores, imagino ;-).

Alex Martelli
fonte
9
O GWT é principalmente uma tecnologia do lado do cliente - você pode usá-lo independentemente de seu back-end ser python ou java. Você perde um pouco de açúcar sintático por ter que fazer RPC sobre JSON em vez de GWT é construído em RPC, mas se você odeia JS e fazer python ainda vale a pena um olhar :)
Peter Recore
9
Existe o Pyjamas ( pyjs.org ) como uma alternativa pitônica ao GWT - ele pega o código Python e o compila no Javascript, assim como o GWT faz no código Java.
Dave Kirby
7
Apenas para dar uma perspectiva de "5 anos depois". Como desenvolvedor Java, sinto que o GAE está executando uma pilha desatualizada. Você não encontrará o suporte ao Java 8 ( eles estão executando o Java 6 e o contêiner herdado do Jetty 6 com Servlet API 2.5 ). No entanto, todo o suporte ao Java no GAE ainda está parado em 2010. Embora eu adore a simplicidade do GAE e o Google Powerful Services, Não posso recomendar o GAE para Java até que eles atualizem sua pilha.
Anthony Accioly
72

Assista a este aplicativo para obter alterações no desempenho do Python e Java:

http://gaejava.appspot.com/ (edit: desculpas, o link está quebrado agora. Mas o seguinte para ainda se aplica quando o vi rodando pela última vez)

Atualmente, Python e o uso da API de baixo nível em Java são mais rápidos que o JDO em Java, para este teste simples . Pelo menos se o mecanismo subjacente for alterado, esse aplicativo deve refletir as alterações de desempenho.

Richard Watson
fonte
5
Com todo o respeito, acho esse teste simples o suficiente para não ter sentido. Pelo que vale a pena ... Se você usa Java / GAE, recomendo o uso da API de baixo nível e evite o JDO ou qualquer outra estrutura. Mais importante, o JDO fornece a "sensação" de que você está trabalhando com um banco de dados relacional, o que pode ser "enganoso".
Mo'in Creemers
1
Concordo em evitar o JDO, em parte pelo motivo mencionado, mas também porque é mais lento que o de baixo nível. (Que o teste geralmente mostra.) Simplesmente sugere que existem diferenças de desempenho, portanto, não use o JDO ou teste para sua tarefa específica. Mudei todo o meu próprio código do JDO e da API de baixo nível para o Objectify. E, em qualquer caso, também mostra que o Python certamente não é o pobre primo de desempenho no GAE.
Richard Watson
1
Seu aplicativo, está lançando Erro interno do servidor.
tomdemuyt
1
Obrigado Tom. Não é meu aplicativo, infelizmente. Enviou alguém que pode estar vinculado.
21812 Richard Watson
1
eu gostaria de ver como Objectify compara neste teste
Moshe Shaham
18

Com base na experiência com a execução dessas VMs em outras plataformas, eu diria que você provavelmente obterá mais desempenho bruto do Java que o Python. Não subestime os pontos de venda do Python, no entanto: a linguagem Python é muito mais produtiva em termos de linhas de código - o acordo geral é que o Python requer um terço do código de um programa Java equivalente, enquanto permanece ou é mais legível. Esse benefício é multiplicado pela capacidade de executar código imediatamente sem uma etapa explícita de compilação.

Com relação às bibliotecas disponíveis, você encontrará que grande parte da extensa biblioteca de tempo de execução do Python funciona imediatamente (assim como o Java). A popular estrutura da Web do Django ( http://www.djangoproject.com/ ) também é suportada no AppEngine.

Com relação ao 'poder', é difícil saber o que você quer dizer, mas o Python é usado em muitos domínios diferentes, especialmente na Web: o YouTube é escrito em Python, assim como o Sourceforge (na semana passada).

Judy2K
fonte
Obrigado Judy2K! Por poder, quero dizer, pode fazer mais coisas e fácil de estender.
Viet
15

Junho de 2013: este vídeo é uma resposta muito boa de um engenheiro do Google:

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

TLDR; é:

  • Escolha o idioma com o qual você e sua equipe são mais produtivos
  • Se você deseja criar algo para produção: Java ou Python (não Go)
  • Se você possui uma grande equipe e uma base de código complexa: Java (devido à análise e refatoração estáticas de código)
  • Pequenas equipes que iteram rapidamente: Python (embora Java também esteja bem)
Bijan
fonte
9

Uma questão importante a considerar ao decidir entre Python e Java é como você usará o armazenamento de dados em cada idioma (e a maioria dos outros ângulos da pergunta original já foi abordada muito bem neste tópico).

Para Java , o método padrão é usar JDO ou JPA. Eles são ótimos para portabilidade, mas não são muito adequados para o armazenamento de dados.

Uma API de baixo nível está disponível, mas é muito baixa para o uso diário - é mais adequada para a criação de bibliotecas de terceiros.

Para Python, existe uma API projetada especificamente para fornecer aos aplicativos acesso fácil, porém poderoso, ao armazenamento de dados. É ótimo, exceto que não é portátil e, portanto, trava você no GAE.

Felizmente, existem soluções sendo desenvolvidas para os pontos fracos listados nos dois idiomas.

Para Java , a API de baixo nível está sendo usada para desenvolver bibliotecas de persistência que são muito mais adequadas ao armazenamento de dados do que JDO / JPA (IMO). Exemplos incluem o projeto Siena e Objectify .

Recentemente, comecei a usar o Objectify e considero muito fácil de usar e adequado ao armazenamento de dados, e sua crescente popularidade se traduz em um bom suporte. Por exemplo, o Objectify é oficialmente suportado pelo novo serviço Cloud Endpoints do Google. Por outro lado, o Objectify funciona apenas com o armazenamento de dados, enquanto o Siena é 'inspirado' pelo armazenamento de dados, mas foi projetado para funcionar com uma variedade de bancos de dados SQL e de armazenamento de dados NoSQL.

Para o Python , há esforços sendo feitos para permitir o uso da API do armazenamento de dados Python GAE fora do GAE. Um exemplo é o back-end SQLite que o Google lançou para uso com o SDK, mas duvido que eles pretendam que isso cresça em algo pronto para produção. O projeto TyphoonAE provavelmente tem mais potencial, mas também não acho que a produção esteja pronta (corrija-me se estiver errado).

Se alguém tiver experiência com alguma dessas alternativas ou conhece outras pessoas, adicione-as em um comentário. Pessoalmente, gosto muito do armazenamento de dados do GAE - acho que é uma melhoria considerável em relação ao AWS SimpleDB -, por isso desejo o sucesso desses esforços para aliviar alguns dos problemas ao usá-lo.

Tom
fonte
7

Eu recomendo fortemente o Java para GAE e aqui está o porquê:

  1. Desempenho: Java é potencialmente mais rápido que Python.
  2. O desenvolvimento do Python está sob pressão da falta de bibliotecas de terceiros. Por exemplo, não há XSLT para Python / GAE. Quase todas as bibliotecas Python são ligações C (e essas não são suportadas pelo GAE).
  3. API do Memcache: o Java SDK tem habilidades mais interessantes que o Python SDK.
  4. API do armazenamento de dados: o JDO é muito lento, mas a API nativa do armazenamento de dados Java é muito rápida e fácil.

Estou usando Java / GAE em desenvolvimento agora.

Paulo
fonte
1
@Paul - você poderia recomendar (ou fornecer links para) a melhor maneira de lidar com a persistência usando Java no GAE se o JDO não for o caminho a seguir?
Mark
1
@ Mark, desculpe pelo atraso. Eu acho que code.google.com/p/objectify-appengine é a melhor escolha por enquanto.
Paul
7
-1 para as falsidades definitivas nos pontos 2 e 3 e para o nº 4 não fazendo nenhum sentido.
Triptych
@ Triptych, deixe-me saber qual é o nome do processador XSLT para python / GAE? E qual é o equivalente da operação CAS (putIfUntouched) para memcache / python / GAE?
Paul
1
@Paul, se você quiser que eu considere essas coisas como parte de sua resposta, você deve incluí-las na sua resposta. Em vez disso, você inclui uma série de meias-verdades. Ninguém escolhe um idioma com base nos casos de canto que você está criando agora.
Triptych
6

Como você identificou, o uso de uma JVM não o restringe ao uso da linguagem Java. Uma lista de idiomas e links da JVM pode ser encontrada aqui . No entanto , o Google App Engine restringe o conjunto de classes que você pode usar do conjunto Java SE normal e você deseja investigar se alguma dessas implementações pode ser usada no mecanismo de aplicativo.

EDIT: Vejo que você encontrou essa lista

Não posso comentar sobre o desempenho do Python. No entanto, a JVM é uma plataforma muito poderosa em termos de desempenho, dada sua capacidade de compilar e otimizar dinamicamente o código durante o tempo de execução.

Por fim, o desempenho dependerá do que seu aplicativo faz e de como você o codifica. Na ausência de mais informações, acho que não é possível dar mais dicas nessa área.

Brian Agnew
fonte
Obrigado pela resposta rápida, Brian. Pretendo focar a aplicação na busca de url e análise XML e processamento XSLT. Haverá menos veiculação de conteúdo HTTP nos navegadores.
Viet
6

Fiquei surpreso com o quão limpo, direto e sem problemas o SDK do Python / Django é. No entanto, comecei a me deparar com situações em que precisava começar a criar mais JavaScript e pensei que poderia querer aproveitar o GWT e outros utilitários Java. Eu comecei apenas na metade do tutorial do GAE Java e tive um problema após o outro: problemas de configuração do Eclipse, versão do JRE, a complexidade entorpecente do Java e um tutorial confuso e possivelmente quebrado. O check-out deste site e de outros links daqui o garantiu. Voltarei ao Python e procurarei pijamas para ajudar com meus desafios de JavaScript.

mjhm
fonte
5

Estou um pouco atrasado para a conversa, mas aqui estão meus dois centavos. Eu realmente tive dificuldade em escolher entre Python e Java, pois sou versado em ambas as linguagens. Como todos sabemos, existem vantagens e desvantagens para ambos, e você deve levar em conta seus requisitos e as estruturas que funcionam melhor para o seu projeto.

Como costumo fazer nesse tipo de dilema, procuro números para apoiar minha decisão. Eu decidi ir com o Python por várias razões, mas no meu caso, havia um gráfico que era o ponto de inflexão. Se você pesquisar "Google App Engine" no GitHub em setembro de 2014 , encontrará a seguinte figura:

Estatísticas do idioma do GAE

Pode haver muitos vieses nesses números, mas no geral, há três vezes mais repositórios GAE Python do que repositórios GAE Java. Não apenas isso, mas se você listar os projetos pelo "número de estrelas", verá que a maioria dos projetos Python aparece no topo (você deve levar em conta que o Python existe há mais tempo). Para mim, isso é um argumento forte para o Python, porque levo em consideração a adoção e o suporte da comunidade, a documentação e a disponibilidade de projetos de código aberto.

Jaime Ivan Cervantes
fonte
3

É uma boa pergunta, e acho que muitas das respostas deram bons pontos de vista dos prós e contras dos dois lados da cerca. Eu tentei o AppEngine baseado em Python e JVM (no meu caso, eu estava usando o Gaelyk, que é uma estrutura de aplicativos Groovy criada para o AppEngine). Quando se trata de desempenho na plataforma, uma coisa que eu não tinha considerado até que ela estava me encarando é a implicação de "Solicitações de Carregamento" que ocorrem no lado Java da cerca. Ao usar o Groovy, essas solicitações de carregamento são um arrasador.

Eu coloquei uma postagem no tópico ( http://distractable.net/coding/google-appengine-java-vs-python-performance-comparison/ ) e espero encontrar uma maneira de solucionar o problema, mas caso contrário, acho que voltarei a uma combinação Python + Django até que as solicitações java de inicialização a frio tenham menos impacto.

Damon Oehlman
fonte
3

Com base no quanto ouço as pessoas de Java reclamarem do AppEngine em comparação com os usuários de Python, eu diria que o Python é muito menos estressante de usar.

Noah McIlraith
fonte
7
Ouvi dizer que os proprietários da Ford estão reclamando muito mais de seus carros do que os proprietários da Koenigsegg. Por que poderia ser isso?
Axarydax
2

Há também o projeto Unladen Swallow , que aparentemente é financiado pelo Google, se não de propriedade do Google. Eles estão tentando implementar um back-end baseado em LLVM para o bytecode do Python 2.6.1, para que possam usar um JIT e várias otimizações de código nativo / GC / multi-core. (Citação legal: "Aspiramos a não fazer nenhum trabalho original, em vez disso, usando o máximo dos últimos 30 anos de pesquisa possível.") Eles estão procurando uma aceleração de 5x no CPython.

É claro que isso não responde à sua pergunta imediata, mas aponta para um "fechamento da lacuna" (se houver) no futuro (espero).

sincronização
fonte
1
O Unladen Swallow agora é um projeto morto e o último commit tem mais de um ano .
tshepang
2

A beleza do python hoje em dia é o quão bem ele se comunica com outros idiomas. Por exemplo, você pode ter python e java na mesma tabela com o Jython. É claro que o jython, apesar de suportar totalmente as bibliotecas java, não suporta bibliotecas totalmente python. Mas é uma solução ideal se você quiser mexer com as bibliotecas Java. Ele ainda permite que você o misture com código Java sem codificação extra.

Mas até o próprio python deu alguns passos antecipados. Veja ctypes, por exemplo, perto da velocidade C, acessa diretamente as bibliotecas C tudo isso sem deixar o conforto da codificação python. O Cython vai um passo além, permitindo misturar código c com código python com facilidade, ou mesmo se você não quiser mexer com c ou c ++, você ainda pode codificar em python, mas usar variáveis ​​de tipo estaticamente, tornando seus programas python tão rápidos quanto os aplicativos em C . O Cython é usado e suportado pelo google por sinal.

Ontem eu até encontrei ferramentas para python embutir C ou mesmo Assembly (veja CorePy), você não pode ser mais poderoso que isso.

O Python é certamente uma linguagem muito madura, não apenas de pé, mas capaz de cooperar com qualquer outra linguagem com facilidade. Eu acho que é isso que faz do python uma solução ideal, mesmo em cenários muito avançados e exigentes.

Com o python, você pode ter acesso ao C / C ++, Java, .NET e muitas outras bibliotecas com quase zero codificação adicional, oferecendo também uma linguagem que minimiza, simplifica e embeleza a codificação. É uma linguagem muito tentadora.

kilon
fonte
A questão é sobre java vs python no GAE, que possui muitas restrições. Portanto, seus argumentos são inaplicáveis.
Daniyar 3/08/10
Concordo com @Daniyar, que esta resposta está um pouco (ou talvez totalmente) fora do ritmo, mas eu gosto da resposta e isso era algo que eu estava procurando. Obrigado Kilon por compartilhar esse conhecimento. Pode ser que este seja o lugar errado, mas você certamente compartilhou algum conhecimento. +1 e parabéns por isso.
zeFree
1

Foi embora com o Python, apesar de o GWT parecer uma combinação perfeita para o tipo de aplicativo que estou desenvolvendo. O JPA está bastante bagunçado no GAE (por exemplo, sem @Embeddable e outras obscuras limitações não documentadas). Depois de passar uma semana, posso dizer que Java simplesmente não parece certo no GAE no momento.

yanchenko
fonte
1

Alguém deve considerar as estruturas que você pretende usar. Nem todas as estruturas do lado Java são adequadas para aplicativos em execução no App Engine, que é um pouco diferente dos servidores de aplicativos Java tradicionais.

Uma coisa a considerar é o tempo de inicialização do aplicativo. Com aplicativos da web Java tradicionais, você realmente não precisa pensar sobre isso. O aplicativo inicia e depois é executado. Realmente não importa se a inicialização leva 5 segundos ou alguns minutos. Com o App Engine, você pode acabar em uma situação em que o aplicativo é iniciado apenas quando uma solicitação é recebida. Isso significa que o usuário está aguardando enquanto o aplicativo é inicializado. Novos recursos do GAE, como instâncias reservadas, ajudam aqui, mas verifique primeiro.

Outra coisa são as diferentes limitações que o GAE usa no Java. Nem todas as estruturas estão satisfeitas com as limitações de quais classes você pode usar ou o fato de que os threads não são permitidos ou que você não pode acessar o sistema de arquivos local. Esses problemas provavelmente são fáceis de descobrir apenas pesquisando sobre a compatibilidade com o GAE.

Também vi algumas pessoas reclamando de problemas com o tamanho da sessão nas estruturas modernas de interface do usuário (Wicket, a saber). Em geral, essas estruturas tendem a fazer certas trocas, a fim de tornar o desenvolvimento divertido, rápido e fácil. Às vezes, isso pode levar a conflitos com as limitações do App Engine.

Inicialmente, comecei a trabalhar no GAE com Java, mas depois mudei para Python por esses motivos. Meu sentimento pessoal é que o Python é uma escolha melhor para o desenvolvimento do App Engine. Eu acho que Java está mais "em casa", por exemplo, no Elastic Beanstalk da Amazon.

MAS, com o App Engine, as coisas estão mudando muito rapidamente. O GAE está mudando a si próprio e, à medida que se torna mais popular, as estruturas também estão mudando para contornar suas limitações.

Juha Palomäki
fonte