Eu tenho ouvido muito sobre o projeto PyPy . Eles afirmam que é 6,3 vezes mais rápido que o intérprete CPython em seu site .
Sempre que falamos de linguagens dinâmicas como Python, a velocidade é um dos principais problemas. Para resolver isso, eles dizem que o PyPy é 6,3 vezes mais rápido.
A segunda questão é o paralelismo, o infame Global Interpreter Lock (GIL). Para isso, o PyPy diz que pode fornecer o Python sem GIL .
Se o PyPy pode resolver esses grandes desafios, quais são seus pontos fracos que impedem uma adoção mais ampla? Ou seja, o que está impedindo alguém como eu, um típico desenvolvedor de Python, de mudar para o PyPy agora ?
Respostas:
PyPy não suporta numpyPyPy agora suporta numpy . Algumas extensões ainda não são suportadas (Pandas, SciPy etc.), consulte a lista de pacotes suportados antes de fazer a alteração.é experimental no momento.acaba de chegar estável! A partir de 20 de junho de 2014, o PyPy3 2.3.1 - Fulcrum foi lançado !Essas são as principais razões que me afetam, eu diria.
fonte
np.sum(M[1:2*n**2:2, :2*n**2] * M[:2*n**2:2, :2*n**2].conjugate(), axis=1)
?) No Python e isso o torna muito adequado para a comunidade científica. Além disso, fazer as partes não intensivas em Python e distribuir para C os loops intensivos menores é uma estratégia comum e utilizável.Esse site não afirma que o PyPy é 6,3 vezes mais rápido que o CPython. Citar:
Esta é uma declaração muito diferente da declaração geral que você fez e, quando entender a diferença, entenderá pelo menos um conjunto de razões pelas quais não pode simplesmente dizer "use PyPy". Pode parecer que eu sou muito exigente, mas entender por que essas duas afirmações são totalmente diferentes é vital.
Para dividir isso:
A declaração que eles fazem se aplica apenas aos benchmarks que eles usaram. Ele não diz absolutamente nada sobre o seu programa (a menos que ele seja exatamente igual a um de seus benchmarks).
A afirmação é sobre uma média de um grupo de benchmarks. Não há alegações de que a execução do PyPy proporcionará uma melhoria de 6,3 vezes, mesmo para os programas que eles testaram.
Não há alegação de que PyPy vai mesmo executar todos os programas que CPython é executado em tudo , muito menos rápido.
fonte
Como o pypy não é 100% compatível, leva 8 GB de RAM para compilar, é um alvo em movimento e altamente experimental, onde o cpython é estável, o alvo padrão para os construtores de módulos por 2 décadas (incluindo extensões c que não funcionam no pypy ) e já amplamente implantado.
O Pypy provavelmente nunca será a implementação de referência, mas é uma boa ferramenta para ter.
fonte
A segunda pergunta é mais fácil de responder: você basicamente pode usar o PyPy como um substituto, se todo o seu código for puro Python. No entanto, muitas bibliotecas amplamente usadas (incluindo algumas da biblioteca padrão) são escritas em C e compiladas como extensões Python. Alguns deles podem ser feitos para trabalhar com o PyPy, outros não. O PyPy fornece a mesma ferramenta "voltada para a frente" que o Python --- isto é, é Python --- mas suas entranhas são diferentes, portanto, as ferramentas que fazem interface com essas entranhas não funcionam.
Quanto à primeira pergunta, imagino que seja uma espécie de Catch-22 com a primeira: o PyPy está evoluindo rapidamente em um esforço para melhorar a velocidade e aprimorar a interoperabilidade com outro código. Isso tornou mais experimental do que oficial.
Eu acho que é possível que, se o PyPy entrar em um estado estável, ele possa começar a ser mais amplamente usado. Eu também acho que seria ótimo para Python se afastar de seus fundamentos em C. Mas isso não vai acontecer por um tempo. O PyPy ainda não atingiu a massa crítica, onde é quase útil o suficiente para fazer tudo o que você deseja, o que motivaria as pessoas a preencher as lacunas.
fonte
Fiz uma pequena referência sobre esse tópico. Enquanto muitos dos outros pôsteres fizeram bons comentários sobre compatibilidade, minha experiência foi que o PyPy não é muito mais rápido apenas para mover os bits. Para muitos usos do Python, ele realmente existe apenas para converter bits entre dois ou mais serviços. Por exemplo, não há muitos aplicativos da web executando análises intensivas da CPU de conjuntos de dados. Em vez disso, eles pegam alguns bytes de um cliente, os armazenam em algum tipo de banco de dados e depois os devolvem para outros clientes. Às vezes, o formato dos dados é alterado.
Os desenvolvedores do BDFL e do CPython são um grupo de pessoas notavelmente inteligente e conseguiram ajudar o CPython a ter um desempenho excelente nesse cenário. Aqui está um plug-in de vergonha do blog: http://www.hydrogen18.com/blog/unpickling-buffers.html . Estou usando o Stackless, que é derivado do CPython e mantém a interface completa do módulo C. Não encontrei nenhuma vantagem em usar o PyPy nesse caso.
fonte
P: Se o PyPy pode resolver esses grandes desafios (velocidade, consumo de memória, paralelismo) em comparação com o CPython, quais são seus pontos fracos que impedem uma adoção mais ampla?
R: Primeiro, há poucas evidências de que a equipe do PyPy possa resolver o problema de velocidade em geral . Evidências de longo prazo mostram que o PyPy executa certos códigos Python mais lentamente que o CPython e essa desvantagem parece estar profundamente enraizada no PyPy.
Em segundo lugar, a versão atual do PyPy consome muito mais memória que o CPython em um conjunto bastante grande de casos. Portanto, o PyPy ainda não resolveu o problema de consumo de memória.
Se o PyPy resolve os grandes desafios mencionados e, em geral, será mais rápido, com menos memória e mais amigável ao paralelismo do que o CPython, é uma questão em aberto que não pode ser resolvida a curto prazo. Algumas pessoas estão apostando que o PyPy nunca poderá oferecer uma solução geral que permita dominar o CPython 2.7 e 3.3 em todos os casos.
Se o PyPy conseguir ser melhor que o CPython em geral, o que é questionável, a principal fraqueza que afeta sua adoção mais ampla será a compatibilidade com o CPython. Também existem questões como o fato de o CPython ser executado em uma ampla variedade de CPUs e sistemas operacionais, mas essas questões são muito menos importantes em comparação com o desempenho do PyPy e os objetivos de compatibilidade com o CPython.
P: Por que não posso substituir o CPython pelo PyPy agora?
R: O PyPy não é 100% compatível com o CPython, porque não está simulando o CPython. Alguns programas ainda podem depender dos recursos exclusivos do CPython ausentes no PyPy, como ligações C, implementações C de objetos e métodos Python ou a natureza incremental do coletor de lixo do CPython.
fonte
O CPython possui contagem de referência e coleta de lixo, o PyPy possui apenas coleta de lixo.
Portanto, os objetos tendem a ser excluídos anteriormente e
__del__
são chamados de uma maneira mais previsível no CPython. Alguns softwares dependem desse comportamento e, portanto, não estão prontos para migrar para o PyPy.Alguns outros softwares funcionam com ambos, mas usam menos memória com o CPython, porque objetos não utilizados são liberados anteriormente. (Não tenho medidas para indicar o quão significativo isso é e que outros detalhes de implementação afetam o uso da memória.)
fonte
__del__
ser chamado cedo ou totalmente está errado, mesmo no CPython. Como você diz, geralmente funciona e algumas pessoas entendem isso como garantido. Se alguma coisa que referencie o objeto for capturada em um ciclo de referência (o que é bastante fácil - você sabia que a inspeção da exceção atual de uma certa maneira não artificial cria um ciclo de referência?) A finalização é adiada indefinidamente, até o próximo ciclo GC (que pode nunca ser ). Se o próprio objeto fizer parte de um ciclo de referência,__del__
ele não será chamado de forma alguma (antes do Python 3.4).Para muitos projetos, há realmente 0% de diferença entre os diferentes pitães em termos de velocidade. São aqueles que são dominados pelo tempo de engenharia e onde todos os pitães têm a mesma quantidade de suporte de biblioteca.
fonte
Para simplificar: o PyPy fornece a velocidade que falta ao CPython, mas sacrifica sua compatibilidade. A maioria das pessoas, no entanto, escolhe o Python por sua flexibilidade e por seu recurso "incluído na bateria" (alta compatibilidade), não por sua velocidade (ainda é o preferido).
fonte
Encontrei exemplos em que o PyPy é mais lento que o Python. Mas: apenas no Windows.
Então, se você pensa em PyPy, esqueça o Windows. No Linux, você pode obter incríveis acelerações. Exemplo (liste todos os números primos entre 1 e 1.000.000):
Isso é executado 10 (!) Vezes mais rápido no PyPy do que no Python. Mas não nas janelas. Lá é apenas 3x mais rápido.
fonte
O PyPy tem suporte ao Python 3 há algum tempo, mas, de acordo com este post do HackerNoon por Anthony Shaw de 2 de abril de 2018 , o PyPy3 ainda é várias vezes mais lento que o PyPy (Python 2).
Para muitos cálculos científicos, particularmente cálculos matriciais, o numpy é uma escolha melhor (consulte Perguntas frequentes: devo instalar o numpy ou o numpypy? ).
O Pypy não suporta gmpy2. Em vez disso, você pode usar o gmpy_cffi, embora eu não tenha testado sua velocidade e o projeto tenha sido lançado em 2014.
Para problemas do Project Euler, faço uso frequente do PyPy, e para cálculos numéricos simples muitas vezes
from __future__ import division
é suficiente para meus propósitos, mas o suporte ao Python 3 ainda está sendo trabalhado a partir de 2018, com sua melhor aposta no Linux de 64 bits. O Windows PyPy3.5 v6.0, o mais recente em dezembro de 2018, está na versão beta.fonte
Versões suportadas do Python
Para citar o Zen do Python :
Por exemplo, o Python 3.7 introduziu classes de dados e o Python 3.8 introduziu fstring = .
Pode haver outros recursos no Python 3.7 e Python 3.8 que são mais importantes para você. O ponto é que o PyPy não suporta o Python 3.7 ou o Python 3.8 no momento.
fonte