Да, IronPython перекомпилирует импортированный модуль при каждом запуске.На самом деле, дважды.
Это сложно.
При первом проходе код Python анализируется в AST, AST преобразуется в дерево выражений DLR, а дерево выражений сохраняется.Когда наступает время его выполнения, дерево выражений компилируется в набор инструкций для простого основанного на стеке интерпретатора, и код модуля выполняется на этом интерпретаторе.Это не быстро во время работы, но у него очень мало времени запуска.
После того, как кусок кода некоторое время запускается, IronPython сыт по горло тем, насколько он медленный, возвращается к дереву выражений иперекомпилирует код в делегат .NET.Это означает, что он преобразуется в MSIL, а затем в собственный код .NET JIT.Этот код выполняется быстро, но для его создания требуется время.
Это преобразование выполняется для каждой функции (или даже для цикла), поэтому, если вы используете одну функцию из модуля несколько раз, и ни одна изв остальном, только одна обычно используемая функция будет подвергаться генерации IL-кода и JITting.
Однако ни одна из этих компиляций не сохраняется на диск.Программа pyc.py, включенная в IronPython, может предварительно скомпилировать код, но это не делается автоматически, потому что код, сгенерированный во время выполнения, отличается от кода, сгенерированного pyc.py.Код времени выполнения обычно является коллекционным, а код, сгенерированный pyc.py, - нет, а генерация несобираемого кода во время выполнения приводит к утечкам памяти.pyc.py должен сделать импорт быстрее, сохранив несколько шагов, но я не уверен, насколько.