Por que o Python não foi otimizado como implementações modernas de Javascript?


11

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.


2
O IronPython - como qualquer outra linguagem .NET - é compilado na "Common Intermediate Language" da Microsoft, para a qual existem implementações de compilador JIT muito maduras.
Doc Brown

2
Uma linguagem de programação é uma especificação (escrita em algum documento), não um software. Somente implementações de linguagem de programação são software (e podem ser compiladores ou intérpretes).
precisa saber é o seguinte

1
@BasileStarynkevitch: Não entendi o que você está tentando nos dizer com este comentário. O OP está perguntando explicitamente sobre CPython, PyPy e IronPython, que são implementações específicas em Python.
Doc Brown)

1
@DocBrown Parece um ponto relevante a ser levantado, dado o último parágrafo da pergunta, que mostra um mal-entendido quando chama especificamente Python de linguagem interpretada.
precisa saber é o seguinte

Respostas:


19

Por que o Python não possui isso?

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.

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.

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.

IronPython, mesma ideia, mas não vejo como o .NET Framework aumentará a velocidade.

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.


6

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?

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.

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.

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.


3
Especialmente relevante é que, no navegador da Web, não há alternativa ao JavaScript (ou pelo menos, nada disponível em todos os principais navegadores ainda). Se você deseja um desempenho rápido no navegador da web, é necessário ter uma implementação rápida do JavaScript. Enquanto nas plataformas que executam o Python, é quase certo que você pode mudar para outra linguagem que pode ter uma implementação com melhor desempenho.
precisa saber é o seguinte

-3

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.


Como você integra extensões não C ao Python? Eu só conheço extensões C para Cython.

1
@Bey: Basicamente, qualquer coisa em uma biblioteca compartilhada (.dll ou .so) pode ser chamada a partir do python, desde que você conheça as assinaturas das funções - elas podem ser configuradas manualmente, geradas por ferramentas como swing ou mesmo geradas pela documentação doxygen. stackoverflow.com/questions/5811949/... é útil como é blog.heroku.com/see_python_see_python_go_go_python_go
Steve Barnes
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.