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?)

Foi útil?

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 de RPython 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.

  1. A estrutura de tradução
  2. 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top