Porquê compilar o código Python?

porque compilarias um programa em Python? Você pode executá-los diretamente do arquivo .py e ele funciona bem, então há uma vantagem de desempenho ou algo assim?

também reparei que alguns ficheiros da minha aplicação são compilados .pyc enquanto outros não o fazem, porque é que isto acontece?

Author: random, 2009-01-23

10 answers

É compilado para bytecode que pode ser usado muito, muito, muito mais rápido.

A razão pela qual alguns ficheiros não estão compilados é que o programa principal, que invoca com python main.py, é recompilado sempre que executa o programa. Todos os programas importados serão compilados e armazenados no disco.

adição importante por Ben Blank:

Vale a pena notar que ao executar um o programa compilado tem um arranque mais rápido tempo (como não precisa ser compilado), não funciona rapidamente.
 229
Author: Georg Schölly, 2017-05-23 12:10:44

O .o ficheiro pyc é Python que já foi compilado para byte-code. O Python executa automaticamente um .ficheiro pyc se encontrar um com o mesmo nome que um ficheiro .py que invocar.

"Uma Introdução ao Python" diz isto sobre ficheiros Python compilados:

Um programa não funciona mais rápido quando é lido de a'.pyc 'or'.pyo" ficheiro do que quando é lido de um'. py' file; a única coisa que é mais rápida sobre ‘.pyc 'or'.os ficheiros pyo é o velocidade com que estão carregados.

A vantagem de correr A.pyc file é que Python não tem que incorrer na sobrecarga de compilá-lo antes de executá-lo. Uma vez que Python iria compilar para byte-code antes de executar um arquivo .py de qualquer forma, não deveria haver nenhuma melhoria de desempenho além disso.

Quanta melhoria você pode obter com o uso compilado .ficheiros pyc? Isso depende do que o guião faz. Para um script muito breve que simplesmente imprime "Hello World", compilar poderia constituir um grande percentagem do tempo total de arranque e execução. Mas o custo de compilar um script em relação ao tempo de execução total diminui para scripts de execução mais longa.

O programa que nomeia na linha de comandos nunca é gravado em A.ficheiro pyc. Apenas módulos carregados por esse script" main " são salvos dessa forma.

 72
Author: Bill Karwin, 2009-01-22 23:14:33

Ameixas:

Primeiro: ofuscação ligeira e derrotável.

Segundo: se a compilação resultar num ficheiro significativamente menor, irá obter tempos de carga mais rápidos. Que bom para a teia.

Terceiro: o Python pode saltar o passo de compilação. Mais rápido em carga incial. É bom para a CPU e para a web.

Quarto: quanto mais comentares, menor será o ficheiro .pyc ou {3]} em comparação com o ficheiro de código .py.

Quinto: um utilizador final com apenas um .pyc ou .pyo o ficheiro na mão é muito menos propenso a apresentar-lhe um erro causado por uma alteração não revertida de que se esqueceram de lhe falar.

Sexto: se está a apontar para um sistema embutido, a obter um tamanho mais pequeno o arquivo a incorporar pode representar um plus significativo, e a arquitetura é estável assim drawback um, detalhado abaixo, não entra em jogo.

Compilação de Nível Superior

É útil saber que pode compilar um ficheiro de código python de nível superior num ficheiro de código .pyc file por aqui:

python -m py_compile myscript.py

Isto elimina comentários. Deixa docstrings intacto. Se você gostaria de se livrar do docstrings Também (você pode querer seriamente pensar sobre por que você está fazendo isso) então compile desta forma em vez disso...

python -OO -m py_compile myscript.py

...e você vai obter um arquivo .pyo em vez de um arquivo .pyc; igualmente distribuível em termos da funcionalidade essencial do código, mas menor pelo tamanho do despojado docstrings (e menos facilmente compreendido para o emprego subsequente, se tivesse um emprego decente docstrings em primeiro lugar). Mas veja a desvantagem três, abaixo.

Lembre-se que o python usa a data do ficheiro .py, Se estiver presente, para decidir se deve executar o ficheiro .py em oposição ao ficheiro .pyc ou .pyo - - - então, edite o seu ficheiro .py, e o .pyc ou .pyo está obsoleto e os benefícios que ganhou estão perdidos. Você precisa recompilá-lo a fim de obter os benefícios .pyc ou .pyo de volta novamente, como eles podem ser.

Desvantagens:

Primeiro: Há um" cookie mágico " nos ficheiros .pyc e .pyo que indica a arquitectura do sistema em que o ficheiro python foi compilado. Se você distribuir um desses arquivos em um ambiente de um tipo diferente, ele vai quebrar. Se distribuir o .pyc ou .pyo sem o .py associado para recompilar ou {[27] } para substituir o .pyc ou .pyo, o utilizador final também não o pode corrigir.

Segundo: se docstrings for ignorado com o uso da opção da linha de comandos -OO, como descrito acima, ninguém será capaz de obter essa informação, que pode tornar o uso do código mais difícil (ou impossível.)

Terceiro: a opção do Python -OO também implementa algumas optimizações de acordo com a opção da linha de comandos -O; isto pode resultar em alterações na operação. As optimizações conhecidas são:

  • sys.flags.optimize = 1
  • assert As declarações são ignoradas
  • __debug__ = falso

Quarto: se você tivesse feito intencionalmente o seu script python executável com algo no ordem de #!/usr/bin/python na primeira linha, isto é retirado em .pyc e .pyo e essa funcionalidade é perdida.

Quinto: um pouco óbvio, mas se você compilar o seu código, não só o seu uso pode ser impactado, mas o potencial de outros para aprender com o seu trabalho é reduzido, muitas vezes severamente.

 35
Author: fyngyrz, 2015-07-29 18:17:23

Existe um aumento de desempenho na execução de python compilado. No entanto, quando executar um ficheiro .py como um módulo importado, o python irá compilá-lo e armazená-lo, e enquanto o ficheiro .py não mudar, irá usar sempre a versão compilada.

Com qualquer linguagem interpetada quando o ficheiro é usado, o processo parece-se com isto:
1. O ficheiro é processado pelo interpeter.
2. O ficheiro é compilado
3. O código compilado é executado.

Obviamente usando código pré-compilado você pode eliminar o PASSO 2, isto aplica python, PHP e outros. Heres um interessante post no blog explicando as diferenças http://julipedia.blogspot.com/2004/07/compiled-vs-interpreted-languages.html
E aqui está uma entrada que explica o processo de compilação em Python http://effbot.org/zone/python-compile.htm
 9
Author: UnkwnTech, 2015-08-14 17:56:06
Há certamente uma diferença de desempenho ao executar um script compilado. Se você executar scripts normais .py, a máquina compila - o sempre que é executado e isso leva tempo. Em máquinas modernas isso não é perceptível, mas à medida que o script cresce ele pode tornar-se mais de um problema.
 7
Author: matpie, 2009-01-22 23:02:39

Como já mencionado, você pode obter um aumento de desempenho de ter o seu código python compilado em bytecode. Isto é normalmente tratado pelo próprio python, apenas para scripts importados.

Outra razão pela qual poderá querer compilar o seu código python, pode ser para proteger a sua propriedade intelectual de ser copiada e/ou modificada.

Pode ler mais sobre isto na documentação em Python .

 7
Author: Simon B. Jensen, 2009-01-22 23:09:53

Usamos o código compilado para distribuir aos utilizadores que não têm acesso ao código-fonte. Basicamente para impedir programadores inexperientes de mudarem algo acidentalmente ou corrigirem insectos sem nos dizerem.

 3
Author: DrBwts, 2015-06-15 16:14:32
Sim, o desempenho é a principal razão e, tanto quanto sei, a única razão. Se alguns dos seus arquivos não estão sendo compilados, talvez o Python não seja capaz de escrever para o .ficheiro pyc, talvez por causa das permissões do directório ou algo assim. Ou talvez os ficheiros incompletos nunca estejam a ser carregados... (os programas/módulos só são compilados quando são carregados pela primeira vez)
 2
Author: David Z, 2009-01-22 23:03:58

Os iniciantes assumem que o Python é compilado por causa disso .ficheiros pyc. O .pyc file é o bytecode compilado, que é então interpretado. Então, se já executaste o teu código Python antes e tens o ... o ficheiro pyc à mão, irá correr mais rápido da segunda vez, dado que não tem de compilar de novo o bytecode

Compilador: Um compilador é um pedaço de código que traduz a linguagem de alto nível em linguagem de máquina

Intérpretes: Os intérpretes também convertem o alto nível linguagem em equivalentes binários legíveis por máquina. Cada vez que um interpretador obtém um código de linguagem de alto nível para ser executado, ele converte o código em um código intermediário antes de convertê-lo em um código de máquina. Cada parte do código é interpretado e, em seguida, executar separadamente em uma seqüência e um erro é encontrado em uma parte do código que vai parar a interpretação do código, sem traduzir o próximo conjunto de códigos.

Fontes: http://www.toptal.com/python/why-are-there-so-many-pythons http://www.engineersgarage.com/contribution/difference-between-compiler-and-interpreter

 1
Author: Beginner, 2014-01-08 14:13:34

Algo não tocado é a compilação fonte-a-fonte. Por exemplo, nuitka traduz o código Python para C/C++, e compila-o para código binário que corre directamente na CPU, em vez de bytecode Python que corre na máquina virtual mais lenta.

Isto pode levar a speedups significativos, ou permitir-lhe-ia trabalhar com o Python enquanto o seu ambiente depende do código C/C++.

 1
Author: user258532, 2017-12-23 19:30:11