(Предположим, что: время запуска приложения абсолютно критично, мое приложение запущено много, мое приложение работает в среде, в которой импорт медленнее, чем обычно, необходимо импортировать много файлов, а компиляция в файлы .pyc
- это недоступно.)Как объединить несколько исходных файлов Python в один файл?
Я хотел бы объединить все исходные файлы Python, которые определяют набор модулей в один новый исходный файл Python.
Я бы хотел, чтобы результат импорта нового файла был таким, как если бы я импортировал один из исходных файлов (который затем импортировал бы еще несколько исходных файлов и т. Д.).
Возможно ли это?
Это грубое ручное моделирование того, что может произвести инструмент при подаче исходных файлов для модулей «bar» и «baz». Вы должны запустить такой инструмент до развертывания кода.
__file__ = 'foo.py'
def _module(_name):
import types
mod = types.ModuleType(name)
mod.__file__ = __file__
sys.modules[module_name] = mod
return mod
def _bar_module():
def hello():
print 'Hello World! BAR'
mod = create_module('foo.bar')
mod.hello = hello
return mod
bar = _bar_module()
del _bar_module
def _baz_module():
def hello():
print 'Hello World! BAZ'
mod = create_module('foo.bar.baz')
mod.hello = hello
return mod
baz = _baz_module()
del _baz_module
И теперь вы можете:
from foo.bar import hello
hello()
Этот код не учитывают такие вещи, как операторы импорта и зависимости. Есть ли какой-либо существующий код, который будет собирать исходные файлы с помощью этого или какой-либо другой метод?
Это очень схожая идея с инструментами, используемыми для сборки и оптимизации файлов JavaScript перед отправкой в браузер, где задержка нескольких HTTP-запросов вредит производительности. В этом случае Python это задержка импорта сотен исходных файлов Python при запуске, который болит.
Есть ли у вас цифры, которые доказывают, что это повлияет на время запуска интерпретатора? –
Время запуска - определенно проблема. Я надеюсь, что это ускорит ситуацию. Я уточнил ограничения в вопросе. –
Я также скептически отношусь к тому, что здесь вы увидите ускорение. Вам все равно придется загружать X строк кода в виртуальную машину каждый раз, когда приложение перезагружается. Я бы определенно потратил время на подтверждение того, что это ускорит вас, прежде чем потратить время на объединение ваших модулей в один большой файл. – JasonSmith