Pypy - Como pode vencer o Cpython?
-
25-09-2019 - |
Pergunta
De Blog de código aberto do google:
O Pypy é uma reimplementação de Python em Python, usando técnicas avançadas para tentar obter um melhor desempenho que o CPython. Muitos anos de trabalho duro finalmente valeram a pena. Nossos resultados de velocidade geralmente vencem o Cpython, variando de ser um pouco mais lento, a acelerações de até 2x em código de aplicativo real, a acelerações de até 10x em pequenos parâmetros de referência.
Como isso é possível? Qual implementação do Python foi usada para implementar o Pypy? Cpython? E quais são as chances de uma Pypypy ou Pypypy derrotar sua pontuação?
(Em uma nota relacionada ... por que alguém tentaria algo assim?)
Solução
Q1. Como isso é possível?
O gerenciamento de memória manual (que é o que o CPython faz com sua contagem) pode ser mais lento que o gerenciamento automático em alguns casos.
As limitações na implementação do intérprete Cpython impedem certas otimizações que o Pypy pode fazer (por exemplo, bloqueios de granulação fina).
Como Marcelo mencionou, o JIT. Ser capaz de fazer a mosca confirmar que o tipo de objeto pode economizar a necessidade de fazer várias desreferências do ponteiro para finalmente chegar ao método que você deseja ligar.
Q2. Qual implementação do Python foi usada para implementar o Pypy?
O intérprete Pypy é implementado no RPYTHON, que é um subconjunto estaticamente digitado de Python (o idioma e não o intérprete do CPython). - Referir https://pypy.readthedocs.org/en/latest/architecture.html para detalhes.
Q3. E quais são as chances de uma Pypypy ou Pypypy derrotar sua pontuação?
Isso dependeria da implementação desses intérpretes hipotéticos. Se um deles, por exemplo, tomasse a fonte, fizesse algum tipo de análise e converteu -a diretamente em um código de montagem específico de destino rígido depois de executar por um tempo, imagino que seria bastante mais rápido que o CPython.
Atualizar: Recentemente, em um Exemplo cuidadosamente criado, Pypy superou um programa C semelhante compilado com gcc -O3
. É um caso artificial, mas exibe algumas idéias.
Q4. Por que alguém tentaria algo assim?
Do site oficial. https://pypy.readthedocs.org/en/latest/architecture.html#mission-statement
Nosso objetivo é fornecer:
uma estrutura de tradução e suporte comum para produzir
implementações de idiomas dinâmicos, enfatizando um limpo
Separação entre especificação e implementação do idioma
aspectos. Nós chamamos isso deRPython toolchain
_.Uma implementação compatível, flexível e rápida da linguagem Python_ que usa a cadeia de ferramentas acima para ativar novos recursos avançados de alto nível sem precisar codificar os detalhes de baixo nível.
Ao separar as preocupações dessa maneira, nossa implementação de Python - e outras linguagens dinâmicas - é capaz de gerar automaticamente um compilador just -in -time para qualquer linguagem dinâmica. Ele também permite uma abordagem de mistura e correspondência para as decisões de implementação, incluindo muitos que historicamente estão fora do controle de um usuário, como plataforma de destino, modelos de memória e encadeamento, estratégias de coleta de lixo e otimizações aplicadas, incluindo se devem ou não ter ou não ter ou não ter um jit em primeiro lugar.
O compilador C GCC é implementado em C, o Haskell Compiler GHC está escrito em Haskell. Você tem algum motivo para o intérprete/compilador Python não ser escrito em Python?
Outras dicas
"Pypy é uma reimplementação de Python em Python" é uma maneira bastante enganosa de descrever Pypy, IMHO, embora seja tecnicamente verdadeira.
Existem duas partes principais do Pypy.
- A estrutura de tradução
- O intérprete
A estrutura de tradução é um compilador. Compila Rpython Código até C (ou outros alvos), adicionando automaticamente aspectos como coleta de lixo e um compilador JIT. Isto não podes Lidar com o código Python arbitrário, apenas Rpython.
Rpython é um subconjunto de python normal; Todo o código RPYTHON é o código Python, mas não o contrário. Não existe uma definição formal de Rpython, porque Rpython é basicamente apenas "o subconjunto de Python que pode ser traduzido pela estrutura de tradução de Pypy". Mas para ser traduzido, o código Rpython deve ser estaticamente digitado (Os tipos são inferidos, você não os declara, mas ainda é estritamente um tipo por variável) e você não pode fazer coisas como declarar/modificar funções/classes em tempo de execução também.
O intérprete então é um intérprete de python normal escrito em Rpython.
Como o código RPYTHON é o código Python normal, você pode executá -lo em qualquer intérprete Python. Mas nenhuma das reivindicações de velocidade da Pypy vem da execução dessa maneira; Isso é apenas para um ciclo de teste rápido, porque traduzir o intérprete leva um grandes Tempo.
Com isso entendido, deve ser imediatamente óbvio que especulações sobre Pypypy ou Pypypy não fazem sentido. Você tem um intérprete escrito em Rpython. Você o traduz em código C que executa o Python rapidamente. Lá o processo para; Não há mais rpython para acelerar processando -o novamente.
Então, "como é possível que o Pypy seja mais rápido que o cpython" também se torna bastante óbvio. O Pypy tem uma melhor implementação, incluindo um compilador JIT (geralmente não é tão rápido sem o compilador JIT, acredito, o que significa que o Pypy é mais rápido para programas suscetíveis à compilação JIT). Cpython nunca foi projetado para ser uma implementação altamente otimizadora da linguagem python (embora eles tentem torná -lo um altamente otimizado implementação, se você seguir a diferença).
A parte realmente inovadora do projeto Pypy é que eles não escrevem esquemas sofisticados de GC ou compiladores JIT manualmente. Eles escrevem o intérprete de forma relativamente direta em Rpython, e para todo o RPYTHON é o nível mais baixo do que o Python, ainda é uma linguagem coletada de lixo orientada a objetos, muito mais alto do que C. Então a estrutura de tradução automaticamente Adiciona coisas como GC e JIT. Portanto, a estrutura de tradução é um enorme esforço, mas se aplica igualmente bem ao intérprete Python Python, no entanto, eles mudam sua implementação, permitindo muito mais liberdade na experimentação para melhorar o desempenho (sem se preocupar em introduzir bugs GC ou atualizar o compilador JIT para lidar com as alterações). Isso também significa que, quando eles implementam um intérprete Python3, ele obterá automaticamente os mesmos benefícios. E quaisquer outros intérpretes escritos com a estrutura Pypy (da qual há um número em estágios variados de polimento). E todos os intérpretes que usam a estrutura Pypy suportam automaticamente todas as plataformas suportadas pela estrutura.
Portanto, o verdadeiro benefício do projeto Pypy é separar (tanto quanto possível) todas as partes da implementação de um intérprete eficiente de plataforma para uma linguagem dinâmica. E então crie uma boa implementação deles em um só lugar, que pode ser reutilizada em muitos intérpretes. Essa não é uma vitória imediata como "Meu programa Python funciona mais rápido agora", mas é uma ótima perspectiva para o futuro.
E pode executar seu programa Python mais rápido (talvez).
O Pypy é implementado no Python, mas implementa um compilador JIT para gerar código nativo em tempo real.
O motivo para implementar o Pypy no topo do Python é provavelmente que é simplesmente uma linguagem muito produtiva, especialmente porque o compilador JIT torna o desempenho da linguagem do host um pouco irrelevante.
Pypy está escrito em Python restrito. Ele não é executado em cima do intérprete do CPython, até onde eu sei. O Python restrito é um subconjunto da linguagem Python. Afaik, o intérprete Pypy é compilado no código da máquina; portanto, quando instalado, ele não utiliza um intérprete Python no tempo de execução.
Sua pergunta parece esperar que o intérprete do Pypy esteja sendo executado no topo do CPYTHON enquanto executa o código.Editar: Sim, para usar o Pypy, você primeiro traduz o código Python Pypy, para C e construa com o GCC, para o código JVM BYTE ou para o código .NET CLI. Ver Começando