Melhor resposta
python é interpretado. Embora converta a fonte legível por humanos em bytecode, que armazena no arquivo .pyc, e o arquivo .pyc seja portátil, o arquivo .pyc não é menos interpretado. Por exemplo, alguns interpretadores python armazenam objetos singleton em cache para números inteiros comumente usados -100 a 100. Alguns não. Qual a importância disso?
Um sistema pode interpretar legalmente a operação is, que compara Object.id () como True ou False.
x = 20
x is 20 # Both True and False are valid results.
Demonstração:
$ python3
Python 3.6.3 (default, Oct 3 2017, 21:45:48)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> x = 30
>>> x is 30
True
>>> x = 23442.2
>>> x is 23442.2
False
>>>
Convertendo o Python source to bytecode leva tempo, razoavelmente é mais rápido para python ler o arquivo .pyc do que ler a fonte e reconstruir o .pyc.
Houve um tempo, e eu não acompanhei importar módulos, quando o python procuraria \_\_init\_\_.py em um diretório para carregar um módulo. Foi sensato manter esse arquivo \_\_init\_\_.py pequeno, para que ele importasse secundariamente o código útil que residiria em um arquivo .pyc.
E a otimização python foi para algum lugar? A última vez que soube, o que foi há um bom tempo, o .pyo era um .pyc com comentários removidos.
Resposta
Já respondi a isso aqui: a resposta de Quildreen Motta para Uma linguagem de alto nível como Python pode ser compilada, tornando-a tão rápida quanto C?
Mas, em resumo, as pessoas não usam C ou C ++ porque “re rápido , eles os usam porque têm um desempenho previsível . Um programador pode então dedicar um tempo para otimizar manualmente seus programas e é muito mais fácil raciocinar sobre o desempenho resultante dessas otimizações.
Isso não é tão fácil de fazer em uma linguagem dinâmica, como o Python. Mesmo assim, o PyPy lhe dará mais rápido que Desempenho C (gcc, não totalmente otimizado à mão) em vários cenários, você simplesmente não pode prever quando esses cenários acontecerão porque isso depende de vários fatores (quais dados estão passando por seu programa, quais ramificações foram tomadas, a estabilidade do ramos sobre t ime, hotness do código, etc).
Claro, PyPy faz todas as otimizações enquanto executa seu programa, então ele precisa fazer muitos pesos de custo e algumas otimizações não são aplicadas por causa disso. Assim como os compiladores AOT podem passar 3 meses analisando seu código para gerar um CÓDIGO REALMENTE RÁPIDO, os otimizadores JIT podem gastar minutos analisando seu código. Em nenhum dos casos, o custo provavelmente será compensado, então eles não fazem isso.
Fazer compiladores AOT para Python é muito mais difícil, porque Python é uma linguagem dinâmica. Compiladores AOT, como shedskin – Um compilador experimental (Python restrito) -para-C ++ , usa um subconjunto restrito de Python para poder analisá-lo estaticamente. Esta abordagem é semelhante ao um tirado por RPython, no qual PyPy é baseado.