¿Por qué compilarías un script de Python? Puede ejecutarlos directamente desde el archivo .py y funciona bien, ¿hay alguna ventaja de rendimiento o algo así?
También noto que algunos archivos de mi aplicación se compilan en .pyc mientras que otros no, ¿por qué es esto?
python
compilation
ryeguy
fuente
fuente
import mylib.py
Python se compilarámylib.py
para que lasimport
declaraciones futuras se ejecuten un poco más rápido. Si cambia más tardemylib.py
, entonces se obtendrá re-compilado próxima vez que ha sido importada (Python usa la fecha del archivo de ver que esto sucede.)Respuestas:
Está compilado en bytecode que se puede usar mucho, mucho, mucho más rápido.
La razón por la que algunos archivos no se compilan es porque el script principal, con el que se invoca,
python main.py
se vuelve a compilar cada vez que ejecuta el script. Todos los scripts importados serán compilados y almacenados en el disco.Adición importante de Ben Blank :
fuente
El archivo .pyc es Python que ya se ha compilado en código de bytes. Python ejecuta automáticamente un archivo .pyc si encuentra uno con el mismo nombre que un archivo .py que invocas.
"Una introducción a Python" dice esto sobre los archivos compilados de Python:
La ventaja de ejecutar un archivo .pyc es que Python no tiene que incurrir en la sobrecarga de compilarlo antes de ejecutarlo. Dado que Python compilaría a 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 puede obtener al usar archivos compilados .pyc? Eso depende de lo que haga el guión. Para un script 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 de ejecución total disminuye para los scripts de ejecución más larga.
La secuencia de comandos que nombre en la línea de comandos nunca se guarda en un archivo .pyc. Solo los módulos cargados por ese script "principal" se guardan de esa manera.
fuente
Más:
Primero: ofuscación leve y vencible.
Segundo: si la compilación resulta en 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 carga inicial. Agradable para la CPU y la web.
Cuarto: cuanto más comentes, más pequeño será el archivo
.pyc
o.pyo
en comparación con la fuente.py
archivo .Quinto: un usuario final con solo un
.pyc
o.pyo
archivo en la mano es mucho menos probable que le presente un error que causó por un cambio no revertido del que se olvidó informarle.Sexto: si apunta a un sistema incrustado, obtener un archivo de menor tamaño para incrustar puede representar una ventaja significativa, y la arquitectura es estable, por lo que el inconveniente, que se detalla a continuación, no entra en juego.
Compilación de nivel superior
Es útil saber que puede compilar un archivo fuente de Python de nivel superior en un
.pyc
archivo de esta manera:Esto elimina los comentarios. Se deja
docstrings
intacto. Si también desea deshacerse de éldocstrings
(es posible que desee pensar seriamente en por qué lo está haciendo), compile de esta manera en su lugar ...... y obtendrá un
.pyo
archivo en lugar de un.pyc
archivo; igualmente distribuible en términos de la funcionalidad esencial del código, pero más pequeño por el tamaño del despojadodocstrings
(y menos fácilmente entendible para el empleo posterior si tuviera decentedocstrings
en primer lugar). Pero vea el inconveniente tres, a continuación.Tenga en cuenta que python usa la
.py
fecha del archivo, si está presente, para decidir si debe ejecutar el.py
archivo en lugar del archivo.pyc
o.pyo
--- así que edite su archivo .py, y el.pyc
o.pyo
es obsoleto y se pierden los beneficios que obtuvo. Debe volver a compilarlo para recuperar nuevamente los beneficios.pyc
o.pyo
beneficios, como pueden ser.Inconvenientes:
Primero: hay una "cookie mágica"
.pyc
y.pyo
archivos que indican la arquitectura del sistema en la que se compiló el archivo Python. Si distribuye uno de estos archivos en un entorno de un tipo diferente, se romperá. Si distribuye el.pyc
o.pyo
sin el asociado.py
para recompilar otouch
reemplaza el.pyc
o.pyo
, el usuario final tampoco podrá solucionarlo.Segundo: si
docstrings
se omite con el uso de la-OO
opción de línea de comando 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
-OO
opción de Python también implementa algunas optimizaciones según la-O
opción de línea de comando; Esto puede resultar en cambios en la operación. Las optimizaciones conocidas son:sys.flags.optimize
= 1assert
las declaraciones se saltan__debug__
= FalsoCuarto: si intencionalmente hiciste que tu script de Python fuera ejecutable con algo del orden de
#!/usr/bin/python
la primera línea, esto se elimina.pyc
y los.pyo
archivos y esa funcionalidad se pierde.Quinto: algo obvio, pero si compila su código, no solo puede verse afectado su uso, sino que el potencial de que otros aprendan de su trabajo se reduce, a menudo severamente.
fuente
Hay un aumento en el rendimiento al ejecutar python compilado. Sin embargo, cuando ejecuta un archivo .py como módulo importado, python lo compilará y almacenará, y siempre que el archivo .py no cambie, siempre usará la versión compilada.
Con cualquier lenguaje interpelado cuando se usa el archivo, el proceso se ve más o menos así:
1. El interpeter procesa el archivo.
2. Se compila el archivo
3. Se ejecuta el código compilado.
obviamente, mediante el uso de código precompilado puede eliminar el paso 2, esto aplica python, PHP y otros.
Aquí hay una publicación de blog interesante 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
fuente
Como ya se mencionó, puede obtener un aumento de rendimiento al compilar su código de Python en bytecode. Esto normalmente lo maneja Python, solo para scripts importados.
Otra razón por la que es posible que desee compilar su código de Python, podría ser para proteger su propiedad intelectual de la copia y / o modificación.
Puede leer más sobre esto en la documentación de Python .
fuente
Ciertamente, hay una diferencia de rendimiento cuando se ejecuta un script compilado. Si ejecuta
.py
scripts normales , la máquina lo compila cada vez que se ejecuta y esto lleva tiempo. En las máquinas modernas, esto apenas se nota, pero a medida que el script crece, puede convertirse en un problema.fuente
Algo que no se menciona es la compilación de fuente a fuente . Por ejemplo,
nuitka
traduce el código de Python a C / C ++ y lo compila en código binario que se ejecuta directamente en la CPU, en lugar del código de bytes de Python que se ejecuta en la máquina virtual más lenta.Esto puede conducir a aceleraciones significativas, o le permitiría trabajar con Python mientras su entorno depende del código C / C ++.
fuente
Utilizamos 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 accidentalmente algo o corrijan errores sin avisarnos.
fuente
Sí, el rendimiento es la razón principal y, hasta donde yo sé, la única razón.
Si algunos de sus archivos no se compilan, tal vez Python no pueda escribir en el archivo .pyc, tal vez debido a los permisos del directorio o algo así. O tal vez los archivos no compilados simplemente nunca se cargan ... (los scripts / módulos solo se compilan cuando se cargan por primera vez)
fuente
Los principiantes asumen que Python se compila debido a los archivos .pyc. El archivo .pyc es el bytecode compilado, que luego se interpreta. Entonces, si ya ha ejecutado su código de Python y tiene a mano el archivo .pyc, 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 una pieza de código que traduce el lenguaje de alto nivel al lenguaje 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
fuente