2011-12-08 10 views
6

En CPython, creo que importar significa compilar el archivo py en un archivo pyc y ejecutar el archivo en el marco actual, y la próxima vez que CPython cargue el archivo pyc directamente sin compilar de nuevo. ¿Qué hay de importar en ironpython? Supongo que ironpython no tiene un formato similar a pyc. ¿Compila cada vez que importa?¿Qué ocurre cuando importamos un módulo en ironpython?

+0

¿Aún no tienes respuestas? Parece que tengo que responderlo yo mismo ... – zchenah

Respuesta

7

Sí, IronPython vuelve a compilar el módulo importado en cada ejecución. Dos veces, en realidad.

Es complicado.

En la primera pasada, el código de Python se analiza en un AST, el AST se convierte en un árbol de expresión DLR y se almacena el árbol de expresiones. Cuando llega el momento de ejecutarlo, el árbol de expresiones se compila en un conjunto de instrucciones para un intérprete simple basado en la pila y el código del módulo se ejecuta en ese intérprete. No es rápido cuando se ejecuta, pero tiene muy poco tiempo de inicio.

Después de que un fragmento de código se haya ejecutado durante un tiempo, IronPython se harta de lo lento que es, vuelve al árbol de expresiones y vuelve a compilar el código en un delegado .NET. Esto significa que se convierte a MSIL y luego a código nativo mediante .NET JIT. Este código es rápido de ejecutar, pero lleva tiempo crearlo.

Esta conversión se realiza por función (o incluso por bucle), de modo que si utiliza una función de un módulo repetidamente y ninguna de las demás, solo la función que se usa habitualmente pasará por el código IL completo generación y JITting.

Sin embargo, ninguna de esta compilación se guarda en el disco. El programa pyc.py incluido con IronPython puede precompilar el código, pero no se hace automáticamente porque el código generado en tiempo de ejecución es diferente del código generado por pyc.py. El código de tiempo de ejecución suele ser coleccionable, mientras que el código generado por pyc.py no lo es, y la generación de un código no recopilable en el tiempo de ejecución genera fugas de memoria. pyc.py debería hacer las importaciones más rápidas guardando algunos pasos, pero no estoy seguro de cuánto.

+0

¡Muchas gracias! – zchenah

Cuestiones relacionadas