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?
Respuesta
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.
¡Muchas gracias! – zchenah
- 1. Cuando se invoca un Thread.interrupt() en algún hilo, ¿qué ocurre?
- 2. ¿Qué registrar cuando ocurre una excepción?
- 3. ¿Qué ocurre en Excel?
- 4. Eliminar un objeto cuando ocurre una colisión
- 5. ¿Qué sucede en la arquitectura x86 cuando ocurre una interrupción?
- 6. ¿Qué ocurre con "Microsoft.Practices.EnterpriseLibrary.Caching" cuando intenta acceder a "CacheFactory.GetCacheManager();"?
- 7. Cuando ordeno una Lista, ¿qué ocurre con sus iteradores?
- 8. ¿Qué IronPython IDE debería usar?
- 9. 500.19 error en IIS7 cuando ocurre un error
- 10. ¿Qué ocurre exactamente cuando asigna una referencia a un elemento en Array en Java?
- 11. ¿Qué hace "nuevo" cuando lo llama un módulo de erlang?
- 12. Excepción apropiada para lanzar cuando ocurre un error de análisis?
- 13. Incrustar IronPython en C#
- 14. ¿Qué ocurre cuando un archivo es `fuente`-d en contexto Unix/Linux?
- 15. ¿Qué ocurre exactamente cuando tienes valores finales y clases internas en un método?
- 16. en la caja virtual, ¿qué ocurre cuando asigna más de un núcleo virtual?
- 17. Configuración de Sinatra en Nginx: ¿qué ocurre?
- 18. ¿Qué ocurre si falta php.ini?
- 19. ¿Por qué ocurre este AttributeError en python?
- 20. ¿Cómo ocurre realmente un syscall en Linux?
- 21. ¿Puedes encasillar un objeto .NET en IronPython?
- 22. Cuando un programa termina ¿qué ocurre con la memoria asignada utilizando malloc que no está libre?
- 23. IronPython y pdb.set_trace()
- 24. ¿Qué ocurre con el restablecimiento de un grupo de aplicaciones?
- 25. Detecta cuando un Módulo (DLL) está descargado
- 26. ¿Qué ocurre si compila un archivo java vacío?
- 27. IronPython en Unity3D
- 28. INotifyPropertyChanged: ¿qué ocurre detrás de la escena?
- 29. ¿Cómo creo un servicio web en IronPython?
- 30. Cómo usar un dll C# en IronPython
¿Aún no tienes respuestas? Parece que tengo que responderlo yo mismo ... – zchenah