Pergunta

Eu estou trabalhando em um projeto usando Hadoop e parece incorporar nativamente Java e fornecer streaming de suporte para Python. É que há um impacto no desempenho significativo para escolher um sobre o outro? Estou suficientemente cedo no processo onde eu posso ir de qualquer forma, se houver uma maneira diferença significativa de desempenho ou de outra.

Foi útil?

Solução

Java é menos dinâmico do que Python e mais esforço tem sido colocado em sua VM, tornando-se uma linguagem mais rápido. Python também é retido pelo seu Global Interpreter Lock, o que significa que não pode empurrar fios de um único processo no núcleo diferente.

Se isso faz alguma diferença significativa depende do que você pretende fazer. Eu suspeito que ambas as línguas irá trabalhar para você.

Outras dicas

Com Python você provavelmente vai desenvolver mais rapidamente e com Java vai certamente correr mais rápido.

Google "benchmarksgame" se você quiser ver algumas comparações de velocidade muito precisas entre todas as linguagens populares, mas se bem me lembro que você está falando 3-5x mais rápido.

Dito isso, poucas coisas são processador ligado estes dias, por isso, se você se sentir como você desenvolver melhor com Python, têm-no!


Em resposta ao comentário (como pode java ser mais rápido do Python):

Todas as línguas são processadas de forma diferente. Java é sobre o mais rápido após C & C ++ (que pode ser mais rápido ou até 5x mais rápido do que Java, mas parece torno média 2x mais rápido). O resto são de 2-5 + vezes mais lento. Python é uma das mais rápidas após Java. Eu estou supondo que C # é aproximadamente tão rápido como Java ou talvez mais rápido, mas o benchmarksgame só tinha Mono (que foi um pouco mais lento), porque eles não executá-lo no Windows.

A maioria dessas reivindicações são baseadas na linguagem de computador benchmarks jogo que tende a ser muito justo porque os defensores do / especialistas em cada língua emenda do teste escrito em sua língua específica para garantir o código é bem orientada.

Por exemplo, este mostra todos os testes com Java vs C ++ e você pode ver as faixas de velocidade de cerca de igual java sendo 3x mais lento (primeira coluna é entre 1 e 3), e usa Java muito mais memória!

Agora desta página mostra java vs python (do ponto de vista do Python). Assim, as velocidades variam de python ser 2x mais lento do que Java para 174 x mais lento, python geralmente bate java no tamanho do código e uso de memória embora.

Outro ponto interessante aqui - testes que alocados muita memória, Java, na verdade, teve um desempenho significativamente melhor do que Python no tamanho da memória também. Tenho certeza java normalmente perde a memória devido a sobrecarga da VM, mas uma vez que os fatores de fora, java é provavelmente mais eficiente do que a maioria (novamente, exceto o C 's).

Esta é Python 3, a propósito, a outra plataforma python testado (Just chamado Python) faired muito pior.

Se você realmente queria saber como é mais rápido, a VM é incrivelmente inteligente. Ele compila a linguagem de máquina após a execução do código, para que ele saiba o que os caminhos de código mais prováveis ??são e otimiza para eles. alocação de memória é uma arte - realmente útil em uma linguagem OO. Ele pode realizar algumas otimizações de tempo de execução surpreendentes que nenhuma língua não-VM pode fazer. Ele pode ser executado em um muito pequeno footprint de memória quando é forçado a, e é uma linguagem de escolha para dispositivos embarcados, juntamente com C / C ++.

Eu trabalhei em um analisador de sinal para Agilent (acho caro o-scope), onde quase toda a coisa (além da amostragem) foi feito em Java. Isto inclui o desenho da tela, incluindo o rastreio (AWT) e interagindo com os controlos.

Atualmente estou trabalhando em um projeto para todas as futuras caixas de cabo. O Guia, juntamente com a maioria dos outros aplicativos será escrito em Java.

Por que não seria mais rápido do que Python?

Você pode escrever transformações MapReduce do Hadoop quer como "fluxo" ou como um "jar personalizado". Se você usar a transmissão, você pode escrever seu código em qualquer linguagem que você gosta, incluindo Python ou C ++. Seu código vai apenas ler de STDIN e saída para STDOUT. No entanto, nas versões do Hadoop antes 0,21, hadoop o streaming usado para apenas texto stream - não binária - a seus processos. Portanto seus arquivos necessários para ser arquivos de texto, a menos que você fazer algumas transformações funk codificação de si mesmo. Mas agora parece um patch foi adicionado, que agora permite o uso de formatos binários com Hadoop Streaming.

Se você usar um "jar personalizado" (ou seja, você escreveu seu código mapreduce em Java ou Scala usando as bibliotecas do Hadoop), então você terá acesso a funções que permitem a entrada e saída binária (serialize em binário) do seu streaming de processos (e salvar os resultados em disco). Então futuras execuções será muito mais rápido (dependendo de quanto o seu formato binário é menor do que o seu formato de texto).

Então, se o seu trabalho hadoop vai ser I / O limite, em seguida, a abordagem "jar personalizado" será mais rápido (uma vez que ambos Java é mais rápido como cartazes anteriores mostraram e leitura do disco também será mais rápido).

Mas você tem que se perguntar o quão valioso é o seu tempo. Encontro-me muito mais produtivo com python, e escrever Map-Reduce que lê STDIN e escreve para STDOUT é realmente simples. Então, eu, pessoalmente, recomendo ir a rota python - mesmo se você tem que descobrir as coisas codificação binária para fora você mesmo. Desde hadoop 0,21 pegas não-utf8 matrizes de bytes, e uma vez que existe um binário (matriz de bytes) alternativo a ser usado para pitão ( http://dumbotics.com/2009/02/24/hadoop-1722-and-typed-bytes/ ), que mostra o código python sendo apenas sobre 25% mais lento do que o código java "jar personalizado", eu definitivamente ir a rota python.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top