从文件路径导入模块非常慢是否有解决方案?

时间:2019-02-21 18:40:57

标签: python-3.x reflection python-importlib

我有一个应该自动以动态方式导入的模块列表。 这是我的代码的一个片段:

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 :(得分:0)

我还没有计时,但是为什么不简化代码。查看您的代码,您想要导入与该文件位于同一目录中的模块。默认情况下,导入模块时,该模块将首先查找。

首先,让我们创建一些文件以将所有文件导入同一目录:

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()

或者,如果您真的想使用点分符号来访问模块的内容,则可以使用named 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()