Por que o PyPy não foi incluído no Python padrão?

165

Eu estava olhando para o PyPy e estava me perguntando por que ele não foi adotado nas distribuições principais do Python. Coisas como a compilação JIT e a menor pegada de memória melhorariam muito as velocidades de todo o código Python?

Em resumo, quais são as principais desvantagens do PyPy que fazem com que ele permaneça um projeto separado?

KLee1
fonte
4
Além disso, o pypy ainda não tem suporte para o numpy. morepypy.blogspot.ch/2012/09/numpy-on-pypy-status-update.html
rthiago
E o suporte numpy apenas arranha a superfície do que os aplicativos de computação científica precisariam antes de mudar para o PyPy. Aqui estão alguns pensamentos convincentes do autor numpy original: technicaldiscovery.blogspot.com/2011/10/…
Stuart Berg
3
Eu acho que essas respostas e comentários são desatualizados
Marlon Abeykoon

Respostas:

249

O PyPy não é um fork do CPython, portanto nunca pode ser mesclado diretamente no CPython.

Teoricamente, a comunidade Python poderia adotar universalmente o PyPy, o PyPy poderia ser implementado como referência e o CPython poderia ser descontinuado. No entanto, o PyPy tem suas próprias fraquezas:

  • O CPython é fácil de integrar com os módulos Python escritos em C, que é tradicionalmente o modo como os aplicativos Python lidam com tarefas que exigem muita CPU (veja, por exemplo, o projeto SciPy).
  • A própria etapa de compilação do PyPy JIT custa tempo de CPU - é apenas através da execução repetida do código compilado que ele se torna mais rápido no geral. Isso significa que o tempo de inicialização pode ser maior e, portanto, o PyPy não é necessariamente tão eficiente para executar códigos de cola ou scripts triviais.
  • O comportamento de PyPy e CPython não é idêntico em todos os aspectos, especialmente quando se trata de "detalhes de implementação" (comportamento que não é especificado pela linguagem, mas ainda é importante em nível prático).
  • O CPython roda em mais arquiteturas que o PyPy e foi adaptado com sucesso para rodar em arquiteturas incorporadas de maneiras que podem ser impraticáveis ​​para o PyPy.
  • O esquema de contagem de referência do CPython para gerenciamento de memória tem, sem dúvida, impactos de desempenho mais previsíveis do que os vários sistemas de GC do PyPy, embora isso não seja necessariamente verdade para todas as estratégias de "GC puro".
  • O PyPy ainda não oferece suporte completo ao Python 3.x, embora esse seja um item de trabalho ativo.

O PyPy é um ótimo projeto, mas a velocidade de tempo de execução em tarefas que exigem muita CPU não é tudo, e em muitos aplicativos é a menor das muitas preocupações. Por exemplo, o Django pode rodar no PyPy e isso torna a modelagem mais rápida, mas os drivers de banco de dados do CPython são mais rápidos que o do PyPy; no final, qual implementação é mais eficiente depende de onde está o gargalo em um determinado aplicativo.

Outro exemplo: você pensaria que o PyPy seria ótimo para jogos, mas a maioria das estratégias de GC, como as usadas no PyPy, causam tremores visíveis. Para o CPython, a maioria das coisas de jogo com uso intenso de CPU é transferida para a biblioteca PyGame, da qual o PyPy não pode tirar vantagem, já que o PyGame é implementado principalmente como uma extensão C (embora veja: pygame-cffi). Ainda acho que o PyPy pode ser uma ótima plataforma para jogos, mas nunca o vi realmente usado.

O PyPy e o CPython têm abordagens radicalmente diferentes para questões fundamentais de design e fazem trocas diferentes; portanto, nenhuma é "melhor" que a outra em todos os casos.

Andrew Gorcester
fonte
4
Não é verdade que o PyPy não seja adequado para a execução de scripts. Seu tempo de inicialização é praticamente o mesmo do CPython e sua velocidade de interpretação é semelhante.
Lucian
6
Vale ressaltar que o PyPy agora vem com um GC incremental e é potencialmente mais adequado para jogos como conseqüência.
porgarmingduod
63

Por um lado, não é 100% compatível com o Python 2.x e possui apenas suporte preliminar ao 3.x.

Também não é algo que possa ser mesclado - a implementação do Python fornecida pelo PyPy é gerada usando uma estrutura que eles criaram, o que é extremamente legal, mas também completamente diferente da implementação do CPython existente. Teria que ser uma substituição completa.

Existem algumas diferenças muito concretas entre o PyPy e o CPython, sendo uma grande a forma como os módulos de extensão são suportados - o que, se você quiser ir além da biblioteca padrão, é um grande problema.

Também vale a pena notar que o PyPy não é universalmente mais rápido.

Gareth Latty
fonte
54

Veja este vídeo de Guido van Rossum . Ele fala sobre a mesma pergunta que você fez aos 12 minutos e 33 segundos.

Luzes:

  • falta de compatibilidade com Python 3
  • falta de suporte de extensão
  • não é apropriado como código de cola
  • velocidade não é tudo

Afinal, ele é o único a decidir ...

Nenhum
fonte
3
+1 para link COM link direto para parte relevante do vídeo! Também +1 em uma pesquisa informal hilária e verdadeira de Guido van Rossum "quantas pessoas estão usando o PyPy na produção? ... sem mãos? Tosse Bem, acho que ainda há esperança [para o CPython]".
Trevor Boyd Smith
15

Uma razão pode ser que, de acordo com o site PyPy , ele atualmente seja executado apenas na arquitetura Intel x86 de 32 e 64 bits, enquanto o CPython também é executado em outras plataformas. Provavelmente, isso se deve a aprimoramentos de velocidade específicos da plataforma no PyPy. Embora a velocidade seja uma coisa boa, as pessoas geralmente querem que as implementações de linguagem sejam o mais "independentes de plataforma" possível.

Bit a bit
fonte
6
Observe que um back-end do ARM está "quase lá" e um back - end do PowerPC é WIP. Observe também que isso se refere apenas ao compilador JIT e a portabilidade do JIT para uma nova arquitetura requer apenas a implementação de um gerador de código para um IR de nível relativamente simples e baixo, nada mais.
1
A partir de 2018, o PyPy agora roda em mais arquiteturas x86 (32/64 bits no Linunx, Windows, MacOS e BSDs), mas também no Linux, hardware ARM mais recente (ARMv6 ou ARMv7, com VFPv3), big e little endian variantes do PPC64 e s390x.
Frédéric Grosshans 21/03
7

Eu recomendo assistir a esta palestra de David Beazley para mais informações. Responde à sua pergunta, dando clareza sobre a natureza e os meandros do PyPy.

Abhishek Mishra
fonte
6

Além de tudo o que foi dito aqui, o PyPy não é tão sólido quanto o CPython em termos de bugs. Com o SymPy, encontramos cerca de uma dúzia de bugs no PyPy nos últimos dois anos, nas versões lançadas e nas noites.

Por outro lado, apenas encontramos um bug no CPython, que estava em um pré-lançamento.

Além disso, não descarte a falta de suporte ao Python 3. Ninguém na comunidade principal do Python se preocupa mais com o Python 2. Eles estão trabalhando nas próximas grandes novidades do Python 3.4, que será o quinto grande lançamento do Python 3. Os caras do PyPy ainda não conseguiram um deles. Então, eles precisam se atualizar antes de começarem a ser candidatos.

Não me interpretem mal. PyPy é incrível. Mas ainda está longe de ser melhor que o CPython de muitas maneiras muito importantes.

A propósito, se você usar o SymPy no PyPy, não verá uma pegada de memória menor (ou uma aceleração). Consulte https://bitbucket.org/pypy/pypy/issues/1447/ .

asmeurer
fonte
2
A partir de 2018, posso confirmar que vi acelerações de aproximadamente uma ordem de magnitude em diferentes usos sympy
Frédéric Grosshans
1
@ FrédéricGrosshans interessante. Vou ter que tentar compará-lo novamente.
asmeurer