online compile python compilation

compile - ¿Por qué compilar código de Python?



compile python to exe (10)

Algo que no se menciona es la source-to-source-compiling . Por ejemplo, nuitka traduce el código de Python a C / C ++ y lo compila en un código binario que se ejecuta directamente en la CPU, en lugar del código de nuitka de Python que se ejecuta en la máquina virtual más lenta.

Esto puede llevar a aceleraciones significativas, o le permitiría trabajar con Python mientras su entorno depende del código C / C ++.

¿Por qué compilarías un script de Python? Puede ejecutarlos directamente desde el archivo .py y funciona bien, entonces, ¿hay una ventaja de rendimiento o algo así?

También observo que algunos archivos en mi aplicación se compilan en .pyc mientras que otros no, ¿por qué sucede esto?


Ciertamente hay una diferencia de rendimiento cuando se ejecuta un script compilado. Si ejecuta scripts .py normales, la máquina lo compila cada vez que se ejecuta y esto lleva tiempo. En las máquinas modernas, esto casi no se nota, pero a medida que el script crece, puede convertirse en un problema mayor.


Como ya se mencionó, puede obtener un aumento en el rendimiento al tener su código de Python compilado en el código de bytes. Esto generalmente lo maneja Python, solo para scripts importados.

Otra razón por la que podría querer compilar su código de Python, podría ser para proteger su propiedad intelectual de ser copiada y / o modificada.

Puedes leer más sobre esto en la documentación de Python .


El archivo .pyc es Python que ya se ha compilado en el código de bytes. Python ejecuta automáticamente un archivo .pyc si encuentra uno con el mismo nombre que un archivo .py que invoca.

"Una introducción a Python" says esto sobre los archivos compilados de Python:

Un programa no se ejecuta más rápido cuando se lee de un archivo ''.pyc'' o ''.pyo'' que cuando se lee de un archivo ''.py''; lo único que es más rápido acerca de los archivos ''.pyc'' o ''.pyo'' es la velocidad con la que se cargan.

La ventaja de ejecutar un archivo .pyc es que Python no tiene que incurrir en la sobrecarga de compilarlo antes de ejecutarlo. Como Python se compilaría en byte-code antes de ejecutar un archivo .py de todos modos, no debería haber ninguna mejora de rendimiento aparte de eso.

¿Cuánta mejora puedes obtener con el uso de archivos .pyc compilados? Eso depende de lo que haga el guión. Para una secuencia de comandos muy breve que simplemente imprime "Hello World", la compilación podría constituir un gran porcentaje del tiempo total de inicio y ejecución. Pero el costo de compilar un script en relación con el tiempo total de ejecución disminuye para los scripts de ejecución más larga.

El script que nombre en la línea de comandos nunca se guarda en un archivo .pyc. Sólo los módulos cargados por ese script "principal" se guardan de esa manera.


Hay un aumento de rendimiento en la ejecución de Python compilado. Sin embargo, cuando ejecuta un archivo .py como un módulo importado, Python lo compilará y lo almacenará, y siempre que el archivo .py no cambie, siempre utilizará la versión compilada.

Con cualquier idioma interpuesto cuando se usa el archivo, el proceso se parece a esto:
1. El archivo es procesado por el intérprete.
2. El archivo está compilado.
3. Se ejecuta el código compilado.

Obviamente, mediante el uso de código precompilado puede eliminar el paso 2, esto se aplica a Python, PHP y otros.

Aquí hay una interesante entrada de blog que explica las diferencias http://julipedia.blogspot.com/2004/07/compiled-vs-interpreted-languages.html
Y aquí hay una entrada que explica el proceso de compilación de Python http://effbot.org/zone/python-compile.htm


Los principiantes asumen que Python está compilado debido a los archivos .pyc. El archivo .pyc es el código de bytes compilado, que luego se interpreta. Por lo tanto, si ha ejecutado su código Python anteriormente y tiene el archivo .pyc a mano, se ejecutará más rápido la segunda vez, ya que no tiene que volver a compilar el código de bytes.

compilador: un compilador es un fragmento de código que traduce el lenguaje de alto nivel al lenguaje de máquina

Intérpretes: los intérpretes también convierten el lenguaje de alto nivel en equivalentes binarios legibles por máquina. Cada vez que un intérprete obtiene un código de lenguaje de alto nivel para ser ejecutado, convierte el código en un código intermedio antes de convertirlo en el código de la máquina. Cada parte del código se interpreta y luego se ejecuta por separado en una secuencia y se encuentra un error en una parte del código que detendrá la interpretación del código sin traducir el siguiente conjunto de códigos.

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


Sí, el rendimiento es la razón principal y, que yo sepa, la única razón.

Si algunos de sus archivos no se están compilando, tal vez Python no pueda escribir en el archivo .pyc, tal vez debido a los permisos del directorio o algo así. O quizás los archivos no compilados simplemente nunca se carguen ... (los scripts / módulos solo se compilan cuando se cargan por primera vez)


Se compila a bytecode que se puede utilizar mucho, mucho, mucho más rápido.

La razón por la que algunos archivos no se compilan es que el script principal, que invoca con python main.py se python main.py cada vez que ejecuta el script. Todos los scripts importados serán compilados y almacenados en el disco.

Importante adición por Ben Blank :

Vale la pena señalar que, si bien la ejecución de un script compilado tiene un tiempo de inicio más rápido (ya que no es necesario compilarlo), no se ejecuta más rápido.


Usamos código compilado para distribuir a los usuarios que no tienen acceso al código fuente. Básicamente, para evitar que los programadores inexpertos cambien algo accidentalmente o corrijan errores sin avisarnos.


Ventajas:

Primero: ofuscación leve, derrotable.

Segundo: si la compilación da como resultado un archivo significativamente más pequeño, obtendrá tiempos de carga más rápidos. Agradable para la web.

Tercero: Python puede omitir el paso de compilación. Más rápido en la carga inicial. Agradable para la CPU y la web.

Cuarto: cuanto más comente, menor será el archivo .pyo o .pyo en comparación con el archivo .py origen.

Quinto: un usuario final con solo un archivo .pyo o .pyo en la mano es mucho menos probable que le presente un error causado por un cambio no revertido del cual se olvidaron de informarle.

Sexto: si está apuntando a un sistema integrado, obtener un archivo de tamaño más pequeño para incrustar puede representar una ventaja significativa, y la arquitectura es estable, por lo que el inconveniente uno, que se detalla a continuación, no entra en juego.

Compilación de nivel superior

Es útil saber que puede compilar un archivo de origen de Python de nivel superior en un archivo .pyc esta manera:

python -m py_compile myscript.py

Esto elimina los comentarios. Deja intactas las docstrings . Si también desea deshacerse de las docstrings (es posible que desee pensar seriamente por qué lo está haciendo), compile de esta manera ...

python -OO -m py_compile myscript.py

... y obtendrás un archivo .pyo lugar de un archivo .pyc ; igualmente distribuible en términos de la funcionalidad esencial del código, pero más pequeño por el tamaño de las docstrings eliminadas (y, en primer lugar, menos fácilmente comprensible para el empleo posterior si tenía docstrings de docstrings decentes en primer lugar). Pero ver inconveniente tres, a continuación.

Tenga en cuenta que python utiliza la fecha del archivo .py , si está presente, para decidir si debe ejecutar el archivo .py en lugar del archivo .pyo o .pyo , así que edite su archivo .py y el archivo .pyc o .pyo está obsoleto y cualquier beneficio que gane se pierde. .pyo volver a compilarlo para volver a obtener los beneficios de .pyo o .pyo , como pueden ser.

Inconvenientes:

Primero: hay una "cookie mágica" en los .pyc .pyo y .pyo que indica la arquitectura del sistema en la que se compiló el archivo de Python. Si distribuye uno de estos archivos en un entorno de un tipo diferente, se romperá. Si distribuye el .pyo o el .pyo sin el .py asociado para recompilar o touch por lo que reemplaza al .pyo o .pyo , el usuario final tampoco puede repararlo.

Segundo: si se omiten las docstrings con el uso de la opción de línea de comando -OO como se describe anteriormente, nadie podrá obtener esa información, lo que puede hacer que el uso del código sea más difícil (o imposible).

Tercero: la opción -OO de Python también implementa algunas optimizaciones según la opción de línea de comando -O ; Esto puede resultar en cambios en la operación. Las optimizaciones conocidas son:

  • sys.flags.optimize = 1
  • assert declaraciones de afirmación se omiten
  • __debug__ = Falso

Cuarto: si intencionalmente hizo ejecutable su script de Python con algo del orden de #!/usr/bin/python en la primera línea, esto se elimina en los .pyc .pyo y .pyo y esa funcionalidad se pierde.

Quinto: algo obvio, pero si compila su código, no solo puede verse afectado su uso, sino que también se reduce la posibilidad de que otros aprendan de su trabajo, a menudo con severidad.