2009-05-12 14 views
11

Para meterme en la cantidad limitada de almacenamiento del sistema de archivos disponible en un sistema integrado con el que estoy jugando actualmente, me gustaría eliminar cualquier archivo que pueda eliminarse razonablemente sin afectar significativamente la funcionalidad o el rendimiento. Los archivos * .py, * .pyo y * .pyc en la cuenta de la biblioteca de Python para una cantidad considerable de espacio, me pregunto cuál de estas opciones sería más razonable para una instalación de Python 2.6 en un pequeño sistema integrado:Python * .py, * .pyo, * .pyc: ¿Qué se puede eliminar para un sistema integrado?

  1. Keep * .py, eliminar * * .pyc y .pyo (Mantener la capacidad de depuración, el rendimiento se resiente?)
  2. Keep * .py y .pyc *, * eliminar .pyo (¿Tiene optimización realmente comprar nada ?)
  3. Keep * .pyc, eliminar * .pyo y * .py (¿Funcionará?)
  4. Keep * .py, .pyc *, y * .pyo (todos son necesarios?)
+0

Como recuerdo, los archivos .pyc se generan automáticamente la primera vez que se ejecutan los archivos .py. – Powerlord

+1

El archivo .pyc se genera automáticamente la primera vez que se importan archivos .py –

Respuesta

13

http://www.network-theory.co.uk/docs/pytut/CompiledPythonfiles.html

Cuando el intérprete Python se invoca con la bandera -O, se genera código optimizado y se almacenan en archivos ‘.pyo’. El optimizador actualmente no ayuda mucho; solo elimina declaraciones de afirmación.

Pasar dos -O banderas para el intérprete de Python (-OO) hará que el compilador de códigos de bytes realice optimizaciones que, en algunos casos excepcionales, podrían dar como resultado un funcionamiento defectuoso de los programas. Actualmente, solo doc cadenas se eliminan del bytecode, lo que resulta en archivos '.pyo' más compactos.

¿Mi sugerencia para usted?

Use -OO para compilar solo .pyo archivos si no necesita declaraciones de afirmación y __doc__ cadenas.

De lo contrario, vaya con .pyc solamente.

Editar

me di cuenta de que sólo se ha mencionado la biblioteca de Python. Gran parte de la biblioteca de Python se puede eliminar si solo necesita una parte de la funcionalidad.

También sugiero que eche un vistazo a tinypy que es un gran subconjunto de Python en aproximadamente 64kb.

+0

Tinypy se ve muy interesante, aunque podría ser un poco * muy * pequeño para mis necesidades. –

+1

Cabe señalar que las pycs no siempre se transfieren muy bien a otras versiones de python. Esto puede no ser un problema para el OP, pero si tiene el espacio, será una cosa menos de la que preocuparse. –

+0

@Jason, no hay especificaciones para el bytecode de Python. Por lo tanto, pycs y pyos pueden ser incompatibles entre versiones. – Unknown

3

El número 3 debería funcionar. No necesita los archivos .pyo o .py para usar el código python compilado.

1

Lo que finalmente se reduce a esto es que realmente solo necesitas una de las tres opciones, pero tu mejor opción es ir con .pys y .pyos o .pycs.

Así es como veo a cada una de sus opciones:

  1. Si pones las .pys en un archivo zip, que no verá pycs o pyos construidas. También se debe señalar que la diferencia de rendimiento solo se da en el tiempo de inicio, y aun así no es demasiado grande en mi experiencia (sin embargo, su kilometraje puede variar). También tenga en cuenta que hay una forma de evitar que el intérprete muestre .pycs como Algorias.
  2. Creo que esta es una opción ideal (ya sea que o .pys y .pyos) porque obtiene la mejor combinación de rendimiento, depuración y fiabilidad. Usted no necesariamente necesita un archivo fuente y un archivo compilado.
  3. Si realmente tiene poco espacio y necesita un rendimiento, esto funcionará. Sin embargo, te aconsejo que guardes el .pys si es posible. Los binarios compilados (.pycs o .pyos) no siempre se transfieren a diferentes versiones de python.
  4. Es dudoso que necesite los tres a menos que planee ejecutar en modo optimizado a veces y en modo no optimizado a veces.

En términos de espacio, ha sido mi experiencia (muy anecdótica) que los archivos .py comprimen mejor que los .pycs y .pyos si los pones en un archivo zip. Si planeas comprimir los archivos, los .pyos no tienden a ganar mucho en términos de espacio, ya que las cadenas de documentos tienden a comprimirse bastante bien y afirman que no ocupan tanto espacio.

+1

Está usando un sistema integrado, por lo que si va con .py en un archivo zip, tendrá la carga adicional de descomprimir en la memoria (que es probable que tenga incluso menos). – Unknown

+0

Probablemente tengas razón. Trataba principalmente de señalar los pros y los contras de cada enfoque sin recomendar el "mejor" enfoque ya que no conozco los detalles de lo que necesita el OP. –

2

Recomendaría mantener solo archivos .py. La diferencia en el tiempo de inicio no es tan buena, y tener la fuente alrededor es una ventaja, ya que se ejecutará bajo diferentes versiones de Python sin ningún problema.

A partir de python 2.6, establecer sys.dont_write_bytecode en True suprimirá la compilación de los archivos .pyc y .pyo, por lo que es posible que desee utilizar esa opción si tiene 2.6 disponible.

1

Así es como puedo minimizar los requisitos de disco para la línea principal de Python 2.7 en el trabajo del día:

1) eliminar los paquetes de la biblioteca estándar, que no será necesario. La siguiente es una lista conservadora:

bsddb/test ctypes/test distutils/tests email/test idlelib lib-tk 
lib2to3 pydoc.py tabnanny.py test unittest 

Tenga en cuenta que algunos códigos Python pueden tener dependencias sorprendentes; p.ej. setuptools necesita unittest para ejecutar.

2) Precompila todo el código de Python, usando -OO para despojar de las afirmaciones y docstrings.

find -name '*.py' | python -OO -m py_compile - 

Tenga en cuenta que Python por defecto no mira los archivos .pyo; también debe solicitar explícitamente la optimización en tiempo de ejecución, utilizando una opción o una variable de entorno. ejecutar secuencias de comandos en una de las siguientes maneras:

python -OO -m mylib.myscript 
PYTHONOPTIMIZE=2 python -m mylib.myscript 

3) Eliminar .py archivos de código fuente (a menos que necesite para funcionar como guiones) y .pyc archivos no optimizadas.

find '(' -name '*.py' -or -name '*.pyc' ')' -and -not -executable -execdir rm '{}' ';' 

4) Comprima los archivos de la biblioteca Python. Python puede cargar módulos desde un archivo zip. Las rutas en el archivo zip deben coincidir con la jerarquía del paquete; por lo tanto, debe combinar los directorios site-packages y .egg en el directorio principal de la biblioteca antes de comprimirlos. (O puede agregar varios archivos zip a la ruta de acceso de Python).

En Linux, la ruta predeterminada de Python incluye /usr/lib/python27.zip, así que simplemente suelte el archivo zip allí y ya está listo.

Deje os.pyo como un archivo ordinario (sin comprimir), ya que Python lo busca como una comprobación de cordura. Si lo mueve al archivo comprimido, recibirá una advertencia sobre cada invocación de Python (aunque todo seguirá funcionando).O simplemente puede dejar un archivo os.py vacío allí y colocar el real en el archivo zip.

notas finales:

  • De esta manera, Python cabe en 7 MB de espacio en disco. Hay mucho más que se puede hacer para reducir el tamaño, pero 7 MB era lo suficientemente pequeño para mis propósitos. :)
  • Python bytecode no es compatible entre versiones, pero ¿a quién le importa cuando eres tú quien hace la compilación y tú que controlas la versión de Python?
  • .pyo archivos en un archivo comprimido debe ser una ganancia de rendimiento en todos los casos, a menos que el disco sea extremadamente rápido y el procesador/RAM sea extremadamente lento. De cualquier manera, Python se ejecuta desde la memoria, no en el formato en disco, por lo que solo afecta el rendimiento en la carga. Aunque la extracción de documentos puede ahorrar bastante memoria.
  • Tenga en cuenta que .pyo archivos no contienen assert declaraciones.
  • Los archivos .pyo conservan los nombres de las funciones y los números de línea, por lo que no se reduce la capacidad de búsqueda: aún se obtienen buenos trazados, solo hay que buscar manualmente el número de línea en la fuente, que de todas maneras se tendría que hacer.
  • Si desea "piratear" un archivo en tiempo de ejecución, simplemente colóquelo en el directorio de trabajo actual. Tiene prioridad sobre el archivo zip de la biblioteca.
Cuestiones relacionadas