Организовать импорт тяжелых питонов - PullRequest
2 голосов
/ 08 января 2011

Около 25% моего кода зависит от модулей: Traits, tvtk, ... которые достаточно тяжелы для импорта.На моем компьютере это обычно занимает хорошие 2 секунды (и больше на другом).

Мои модули организованы следующим образом

mainmodule
|--submodule1
|--submodule2
   |--subsubmodule1
   |--subsubmodule2
|--submodule3
|--submodule4
   |--subsubmodule1
   |--subsubmodule2

В них подмодуль 1 и подмодуль 2 используют черты.Это означает, что в 75% случаев, если я позвоню import mainmodule , мне придется ждать импорта тяжелых модулей, но тогда они не будут использоваться.

Как мнеорганизовать импорт так, чтобы я мог сократить время импорта?

Может быть, есть способ сделать что-то вроде:

import mainmodule

и иметь

mainmodule
|--submodule3
|--submodule4
   |--subsubmodule1
   |--subsubmodule2

И толькозвоните:

import mainmodule.heavy

чтобы все было

Ответы [ 2 ]

3 голосов
/ 08 января 2011

Звучит так, будто вы хотите, чтобы импорт mainmodule автоматически не импортировал submodule1 и submodule2, которые долго загружались.

Это довольно просто, на самом деле. Вы можете импортировать submodule1 и submodule2 только в функции, которые в них нуждаются. Или переместите эти функции в отдельный модуль с именем mainmodule_heavy.py.

(Или вы могли бы взломать систему модулей Python, чтобы лениво загружать модули . Но такого рода взлом имеет тенденцию вызывать проблемы, и это звучит ненужно для вашего случая.)

3 голосов
/ 08 января 2011

Вы можете поместить некоторый код, подобный этому, в функцию / модуль: -

def heavy():
    global x
    global y
    import x, y

def mainmodule():
    if heavy not in globals():
        import heavy

На самом деле, это не будет работать в той же программе, так как функция не может быть импортирована.Кроме того, вы хотите проверить строку внутри глобалов, а не сам модуль.Итак, вместо: -

def heavy():
    global x
    global y
    import x, y

def mainmodule():
    if 'x' not in globals() or 'y' not in globals():
        heavy()
...