Импорт модулей из файлового пути очень медленный. Есть ли какое-то решение для этого? - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть список модулей, которые должны быть импортированы автоматически и динанамическим способом.Вот фрагмент из моего кода:

for m in modules_to_import:
    module_name = dirname(__file__)+ "/" +m
    spec = importlib.util.spec_from_file_location("package", module_name)
    imported_module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(imported_module)

Я измерил время, и оно становится все медленнее и медленнее после каждого импорта.Есть ли какое-то решение этого или почему оно становится медленнее?Большое спасибо!

1 Ответ

0 голосов
/ 24 февраля 2019

Я не рассчитывал это, но почему бы вам не упростить ваш код.Глядя на ваш код, вы хотите импортировать модуль, который находится в том же каталоге, что и этот файл.По умолчанию, когда вы импортируете модуль, он ищет его в первую очередь.

Сначала давайте создадим несколько файлов для импорта всех в одном каталоге:

First.py

def display_first():
    print("I'm first")

Second.py

def display_second():
    print("I'm second")

Third.py

def display_third():
    print("I'm third")

Один из способовсделать это, поместив ваши модули в диктовку, которую вы можете использовать впоследствии.Я использую здесь понимание слова, чтобы построить его:

Solution1.py

import importlib

modules_to_import = ["First", "Second", "Third"]

modules_imported = {x: importlib.import_module(x) for x in modules_to_import}

modules_imported["First"].display_first()
modules_imported["Second"].display_second()
modules_imported["Third"].display_third()

Или, если вы действительно хотите использовать, чтобы использовать точечную записьчтобы получить доступ к содержимому модуля, вы можете использовать с именем tuple , чтобы помочь:

Solution2.py

import importlib
import collections

modules_to_import = ["First", "Second", "Third"]

modules_imported = collections.namedtuple("imported_modules", modules_to_import)

for next_module in modules_to_import:
    setattr(modules_imported, next_module, importlib.import_module(next_module))

modules_imported.First.display_first()
modules_imported.Second.display_second()
modules_imported.Third.display_third()
...