Implementações modernas de Javascript como V8 (Chrome), SpiderMonkey (Firefox) e Chakra (IE / Edge) têm compilação JIT e várias outras otimizações para melhorar o desempenho.
Por que o Python não possui isso?
Eu estive olhando PyPy e IronPython, que reivindicam ganhos de velocidade. PyPy Não entendo como uma implementação Python escrita em Python, uma linguagem interpretada, será mais rápida que a implementação de referência em C. IronPython, mesma idéia, mas não vejo como o .NET Framework aumentará a velocidade.
python-3.x
jit
Jay
fonte
fonte
Respostas:
Não sei por que você acha que não há implementações em Python que se preocupam com o desempenho. PyPy , IronPython e Jython são todas implementações de Python de força industrial e prontas para produção que se preocupam com o desempenho. Pyston é uma implementação em desenvolvimento que foi criada especificamente para desempenho. Unladen Swallow e Psyco também foram projetos para melhorar o desempenho do Python.
No entanto, o fato de os usuários do CPython superarem em muito a base total de usuários combinada de todas as outras implementações, de que a Unladen Swallow foi rejeitada pela comunidade, de que a maioria desses projetos está morta ou está lutando para atrair desenvolvedores, deve lhe dizer algo sobre como o Python a comunidade valoriza o desempenho.
Esta resposta é um bom exemplo da mentalidade típica da comunidade Python: em vez de corrigir os problemas de desempenho, eles preferem simplesmente escrever seu código não no Python.
Primeiro: não importa o idioma que o compilador está escrito em Afinal, o compilador só é executado. Uma vez , por isso mesmo se fosse lento, isso não importa: o desempenho do compilador é irrelevante, o que é relevante é o desempenho da saída do compilador.
Em segundo lugar, uma vez que só importa o quão rápido a saída do compilador é, e o compilador é escrito em Python, ou seja, a linguagem que ele compila, ele pode realmente fazer -se rapidamente através da compilação de si.
Em terceiro lugar, não existe uma "linguagem interpretada". Uma linguagem é um conjunto de regras e restrições matemáticas. É uma especificação. Um pedaço de papel. Um idioma não é compilado ou interpretado. Uma linguagem simplesmente é . Compilação e interpretação são características de uma implementação de linguagem , mais precisamente, um compilador ou intérprete (duh!), Não a linguagem. Todo idioma pode ser implementado por um compilador. Todo idioma pode ser implementado por um intérprete. Você pode gerar mecanicamente um compilador a partir de um intérprete e um intérprete a partir de um compilador.
Mas tudo isso realmente não importa, porque o PyPy na verdade não é escrito em Python. Está escrito em RPython . O RPython consiste em duas partes, a linguagem de programação RPython e a estrutura do RPython.
A linguagem de programação RPython não é Python. É uma linguagem de programação diferente. O RPython é uma linguagem de programação com estaticamente, aproximadamente no mesmo nível de abstração que Java, com aproximadamente o mesmo desempenho que C. O RPython é um subconjunto sintático e semântico do Python, o que significa que todo programa RPython é um programa válido do Python e pode ser executado por uma implementação do Python (embora normalmente várias ordens de magnitude mais lenta, mas isso ainda seja útil para depuração, porque você obtém acesso a todas as ferramentas do Python e a interpretação começa imediatamente, enquanto a compilação da implementação da linguagem geralmente leva de 5 a 10 minutos ), mas o inverso não é verdadeiro.
A estrutura RPython é uma estrutura para escrever implementações de linguagem dinâmica de alto desempenho na linguagem de programação RPython. Inclui um coletor de lixo, espaço para objetos, protocolo de metaobjetos, objetos, tipos e operações predefinidos e assim por diante. Mas a joia da coroa é sua capacidade de gerar automaticamente um compilador JIT a partir de um intérprete: se você implementar uma linguagem na estrutura do RPython, precisará apenas escrever um intérprete, a estrutura do RPython cuidará do JIT.
Existem muitas implementações de linguagem na plataforma RPython , não apenas o PyPy.
A maioria das implementações da ISO CLI, como as várias variantes do .NET da Microsoft ou Mono, contêm sofisticados coletores, otimizadores e compiladores de lixo. O mesmo vale para implementações Jython e Java.
O IronPython é um compilador, ele compila o código-fonte Python para as árvores DLR (DLR é o Dynamic Language Runtime), que são então compilados ainda mais para o código de bytes CIL, que normalmente é novamente compilado para o código da máquina nativo.
fonte
O JavaScript está incluído nos navegadores da web e uma quantidade significativa de software hoje é projetada para ser executada nos navegadores da web. Isso torna o desempenho do JavaScript muito importante, fazendo com que empresas como Google, Apple e Microsoft invistam muitos recursos para acelerar os tempos de execução do JavaScript. Se esse fluxo de dinheiro fosse redirecionado para Python, seria igualmente rápido.
A idéia é que, uma vez que o código é editado por JIT, ele não é mais "interpretado". O PyPI funciona transformando o código Python em código de máquina (por exemplo, código de máquina x86_64) que é então executado diretamente no processador.
fonte
Se você estruturar seu código python em módulos com uma inicialização simples de nível superior como o arquivo python principal (com muito pouco código), o python compila todo o restante do código em código de byte independente da máquina. arquivos .pyc que você vê na sua estrutura de diretórios. Isso minimiza os tempos de carregamento e interpretação após a primeira execução.
Se você iniciar seu script com os sinalizadores -O ou -OO ou definir PYTHONOPTIMIZE para um valor maior que 0, os arquivos .pyo serão gerados e otimizados ainda mais.
Se você precisar de alta otimização para algumas funções específicas, escreva-as em C, C ++, FORTRAN ou GO e, em seguida, use-as no python.
fonte