Você provavelmente já ouviu a história de que a linguagem Python é lenta porque é uma linguagem interpretada. Comparando a outras linguagens, como C++, Golang e Rust, que são linguagens compiladas, linguagens como Java, Python e R seriam muito lentas por terem diversos mecanismos rodando em background junto com o seu código. Bom, na verdade isto é verdade sim.
Contudo, você já ouviu falar de Análise Assintótica? Esta é uma técnica que analisa o desempenho de um algoritmo de acordo com o seu input. Somente o fato de existir uma técnica (a propósito, bastante complexa) para realizar a análise de desempenho de um algoritmo já nos demonstra que as coisas não são assim tão simples. Dizer que uma linguagem é lenta porque ela é interpretada é como dizer que um animal é lento porque ele é pesado (tente apostar corrida com um urso antes de argumentar). O fato de uma linguagem ser interpretada ou compilada é apenas um dos fatores que irá influenciar no resultado final da performance do algoritmo, porém há diversos outros fatores que iremos explorar neste artigo.

A primeira coisa que devemos levar em consideração é: estamos comparando dois algoritmos idênticos? No mundo real, quando vamos decidir qual linguagem de programação iremos utilizar, não estamos considerando apenas o core da linguagem em si, mas também todas as suas ferramentas e ecossistema. Isto faz uma enorme diferença, pois muito raramente construímos um script do zero, mas sim utilizamos bibliotecas e outros recursos disponíveis para aquela linguagem. Isto não é um fator apenas relacionado ao tempo necessário para o desenvolvimento da solução, mas também sobre a performance final da solução também. Isto porque o nível de otimização das funções utilizadas por bibliotecas e outros scripts externos também conta para a performance final do script. Isto é, não adianta criar um script em Rust para tentar ganhar mais performance se o seu script possui uma lógica muito menos otimizada do que um script feito em R, Java ou Python. Se você já estudou Análise Assintótica alguma vez, sabe que algumas poucas mudanças na lógica do script podem ter um impacto gigantesco na sua performance final.
Precisamos nos aprofundar um pouco mais nesta questão da otimização das bibliotecas, porque algo que faz muita diferença neste caso é o suporte da comunidade em torno da biblioteca. Quando falamos de suporte da comunidade, falar sobre a comunidade Python é chover no molhado! Sabemos que Python é a linguagem de programação que tem a comunidade mais ativa no momento. Porém, para exemplificar o que eu quero dizer, vamos falar sobre a comunidade da linguagem R. Esta é uma linguagem conhecida por ser adotada pela comunidade de estatísticos, logo, podemos esperar que a linguagem possua diversas bibliotecas com funções estatísticas extremamente otimizadas. Aqui chegamos na questão principal: mesmo utilizando uma linguagem muito mais rápida como Rust ou C, você acha que seria capaz de escrever uma função para executar um cálculo estatístico que possua uma performance melhor do que uma função escrita e revisada por diversos estatísticos do mundo inteiro? Vamos colocar a pergunta de outra forma: Você acha que seria capaz de vencer o Usain Bolt em uma corrida de 100 metros se você largasse 10 metros à frente?

Indo agora para outros fatores, as comparações feitas entre linguagens de programação geralmente são exemplos pouco funcionais. Geralmente são loops executando uma mesma tarefa um milhão de vezes. Contudo, a lógica de funcionamento de cada linguagem vai privilegiar o seu funcionamento em uma situação específica. Eu tenho experiência prática em tentar fazer tratamento de strings utilizando Golang e me lembro de ter que usar diversas funções, algumas precisando importar bibliotecas externas, para chegar ao mesmo resultado que eu tinha com Python. Para ser honesto, eu nunca medi a performance entre as duas linguagens para saber (no caso daquele algoritmo) qual seria mais rápido. No entanto, acredito realmente que o Python provavelmente era mais rápido, porque já possuía tudo nativo.

Por fim, precisamos falar sobre a questão mais importante com relação a este tema: isto é necessário? Você está optando por uma linguagem com uma performance otimizada para construir um script que vai enviar notificações não-urgentes para um pequeno grupo de pessoas? Eu me lembro de ter assistido uma palestra onde foi apresentada uma otimização em Golang sobre um script feito em Python e depois de muitos dias de desenvolvimento conseguiu-se uma melhoria de performance de 40%. O problema é que o script Python rodava em 100 milissegundos e o script em Golang passou a rodar em 60 milissegundos. No fim das contas a diferença era irrelevante para o negócio e o próprio palestrante disse que, se a otimização não tivesse sido feita apenas a título de curiosidade, ele teria ficado muito decepcionado.
Por mais que possa parecer, eu não sou um grande defensor da linguagem Python. Se me perguntarem qual API deve ser usada para um e-commerce que recebe milhões de transações a todo momento, eu imediatamente direi para você considerar seriamente uma API em Rust ou em Golang. Se eu for trabalhar em uma equipe onde a maior parte dos desenvolvedores dominam Java, eu vou ser o primeiro a dizer para desenvolvermos as nossas soluções em Java. Agora, se o meu time domina a linguagem Python e precisamos criar uma API para receber um pequeno volume de requisições diárias. A primeira pessoa que sugerir fazer em outra linguagem de programação argumentando que Python é lento, eu vou dizer que só aceito se antes me apresentar o Curupira ou o Boitatá.


Deixe um comentário