Python é lento? Que Python?

Já vi muita gente falando que Java é ruim porque é lento. Eu mesmo, há tempos atrás, falava isso. Esse é um dos muitos mitos que se propagam entre as pessoas, sem uma análise crítica mais aprofundada. Isso já foi verdade, láááá no começo. Hoje em dia, é possível conseguir melhor desempenho com programas escritos em Java do que programas escritos em C, que é o rei da performance, de acordo com o senso comum.

Hoje em dia, se fala muito que Python é uma ótima linguagem, com sintaxe e recursos excelentes, mas que possui desempenho ruim. Ou seja, dizem que é lento. Mas calma aí, vamos pensar um pouquinho e esclarecer algumas coisas.

Temos dois conceitos separados que muitas vezes são confundidos. Uma coisa é Python, a linguagem. Outra coisa é Python, o interpretador. A linguagem em si nada mais é do que a especificação, com as regras léxicas, sintáticas e semânticas. Já o interpretador Python é o programa que irá ler e executar os programas escritos usando a linguagem Python. Existem várias implementações, e não somente um único interpretador Python. Assim, não faz sentido afirmar que “Python é lento”. O que poderia ser dito é “todos os interpretadores Python existentes são lentos”, mas isso seria uma mentira.

Os interpretadores

O interpretador Python mais conhecido é o CPython, que é a implementação de referência da linguagem. É ele que vem instalado por padrão no Ubuntu, é ele que a grande maioria das pessoas instala quando vai aprender Python e é ele que é usado pelos desenvolvedores quando vão escrever programas em Python. É bem provável que você tenha o CPython instalado aí na sua máquina. Porém, apesar da popularidade, ele não é o único e também não é o mais performático.

Um interpretador que tem ganhado visibilidade é o PyPy. Diferentemente do CPython, que é escrito em linguagem C, o PyPy é escrito em um subconjunto de Python, o RPython. O que mais chama a atenção no PyPy é o desempenho. Ele consegue obter um desempenho bem melhor do que o CPython em muitos casos. Veja o gráfico abaixo, comparando a versão 2.2 do PyPy ao CPython em vários benchmarks (para a versão mais atual, acesse: speed.pypy.org).

Desempenho do PyPy vs CPython

Desempenho do PyPy vs CPython

Talvez você esteja pensando: como o PyPy, escrito em Python, pode ser mais rápido do que o CPython, que é escrito em C e compilado direto para código de máquina? O PyPy é escrito em Python, mas isso não quer dizer que ele é executado sobre um interpretador Python. O código do PyPy, escrito em RPython, é compilado para linguagem de máquina, podendo então ser executado diretamente sobre o hardware (sobre o SO, na verdade). Mas isso por si só não justifica o bom desempenho dele, afinal o CPython também é compilado para código de máquina.

O que diferencia o PyPy é o fato de ele utilizar um mecanismo chamado JIT (Just In Time compilation) durante a interpretação dos programas. O JIT fica analisando a execução do programa, pega as partes que são executadas com mais frequência e, dentre outras coisas, faz uma tradução em tempo de execução daquelas partes para código de máquina. Assim essas partes do programa não precisarão ser decodificadas e executadas pelo interpretador toda vez que tiverem que ser executadas. Além disso, o JIT pode fazer outros tipos de otimização no código, sempre em tempo de execução. Essa técnica é bem antiga, e é usada também em algumas implementações da JVM (Java Virtual Machine).

Mas o CPython e o PyPy não são as únicas implementações do interpretador Python. O Jython é um interpretador que roda sobre a JVM (que por sua vez roda sobre o SO, que roda sobre o hardware, o que acaba gerando problemas de desempenho). Outras implementações populares são: IronPython (implementação em C#), Stackless Python, Unladen Swallow (uma implementação da Google, que foi deixada meio de lado), dentre outros.

Enfim, o importante é perceber que não existe o tal interpretador Python. O que existe é uma variedade de implementações, cada uma com um objetivo. Enquanto para algumas o principal objetivo é oferecer integração com outras plataformas (Jython e IronPython), para outras o objetivo é levar o desempenho ao topo (PyPy, Stackless Python e Unladen Swallow).

O Django é um projeto de grande porte que é suportado pelos principais interpretadores existentes (CPython por padrão, PyPyJythonIronPython). A troca do interpretador que está por debaixo do Django irá impactar na performance dos aplicativos que estiverem rodando sobre o mesmo. Dá pra ter uma ideia mais prática do impacto que a troca do interpretador pode ter no desempenho de uma aplicação lendo esse post: http://tomvn.com/posts/load-testing-and-pypy-smoking-the-competition.html. No texto, o autor relata que implementou uma API e que obteve uma média de 600 requisições por segundo rodando a mesma sobre o CPython. Ao trocar para o PyPy, este número subiu para impressionantes 2k requisições por segundo.

Então Python não é lento?

Não necessariamente, embora em geral os interpretadores ainda não sejam tão bons de performance quanto código escrito em C/C++ ou Java (em 2013). Mas, para poder falar mais, seria necessário realizar experimentos comparando programas escritos em Python e interpretados pelo PyPy com programas escritos em C, por exemplo. Mas esse tipo de comparação é sempre muito subjetiva, pois depende dos recursos usados em cada implementação. De nada adianta comparar uma hashtable escrita em Java com uma hashtable escrita em Python, se uma delas for thread-safe e a outra não, por exemplo.

Acima de tudo, é importante perceber que a perda de performance é compensada pela agilidade possibilitada à equipe de desenvolvimento na hora de escrever uma aplicação e colocá-la em produção. Nem sempre o desempenho é o mais importante em um projeto, afinal, as horas de trabalho dos desenvolvedores também custam muito. Além disso, experimentos mostram que com PyPy é possível melhorar de forma significativa o desempenho de algumas aplicações que rodam no CPython.

Só não se esqueça do famoso mantra do Donald Knuth: “Premature optimization is the root of all evil“.

5 comentários sobre “Python é lento? Que Python?

  1. Republicou isso em Weekend Nerde comentado:
    Tenha sempre em mente: “Temos dois conceitos separados que muitas vezes são confundidos. Uma coisa é Python, a linguagem. Outra coisa é Python, o interpretador. A linguagem em si nada mais é do que a especificação, com as regras léxicas, sintáticas e semânticas.”

  2. Parabéns, gostei do post. Quando comecei a testar o Python, meu irmão sempre brincava dizendo que era lento por ser interpretado. Acho que hoje isso não deve fazer muita diferença por conta da evolução do hardware e também a linguagem passou por várias atualizações durante esse período.

    Existe pouquíssima informação sobre o RPython, principalmente em português que é raro. Você poderia ter dado uma pequena aprofundada como ele foi feito, falar um pouco sobre a LLVM e o projeto. Quem sabe num artigo futuro. 😀

    • Dependendo do que você for fazer, os interpretadores Python ainda são bastante lentos. Programas escritos em C, C++, Java e outras ainda conseguem um desempenho bem melhor. Mas, em muitos casos, a produtividade é mais importante do que o desempenho, então Python entra com muita força na concorrência.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s