我从未设定过基准,但我认为进口(动态的还是静态的)一个模块以前被输入运行中的口译员(即使是完全不相关的代码 ), 应该非常便宜。 它真正需要做的应该是一些(成功的)字典搜索。
导入新模块当然会运行模块中的所有代码, 加上要查找的文件系统搜索 。
所以,如果您反复从一组相对较小的模块中导入一个动态选择模块,那么您就不应该有太多问题,只要您能够容忍延迟,每个特定模块第一次使用(延迟的多少取决于您的模块);稍稍过一段时间后,您重新导入的几乎所有模块都将被导入,因此,的电话将变得便宜。
您可能考虑的替代设计 : 如果您需要的全部模块集在前方( 静态或动态) 是可以了解的, 您可以在循环“ 暖化” Python 导入模块集之前预先导入它们 。 如果 b 中没有很多不使用的模块, 您可以在 b s < code_ init_. py code > 中导入所有模块 。
这样在启动时进口延迟就会在启动时失控, 您可以在 b 套件上使用 < code> getattr code > 来动态地获取您的模块, 而不是需要使用 < codeimport/ code > 。 如果您重新装入如此多的模块, 以至于您 < em> 想要 em > 将导入成本分散在循环中, 或者如果您有许多模块, 但只需要相对较少的模块, 并且很难提前知道哪些模块 。
还有一个可能更好的方法,如果在您重新识别要导入的模块的位置,您可以选择某个常数字符串(而不是从配置文件或用户输入中读取的东西),那么这个方法就会有效。与其将模块的名称从模块的名称转到最终要导入到别处,为什么不导入模块然后和那里,然后将“坚固的”模块本身 坚固的 > 输入到其它处最终使用?作为一个编造的例子,因为我不知道你在做什么,而不是:
for module_name in [ b1 , b2 , b3 , b4 ]:
function_using_module(module_name)
def function_using_module(module_name):
module = __import__(...)
...
你可以做到这一点:
from folder_b import b1, b2, b3, b4
for module in [b1, b2, b3, b4]:
function_using_module(module)
def function_using_module(module):
...
模块是对象,就像其他任何东西一样,所以您可以将其存储在列表或对象中,或者您正在用名称做什么。直接通过模块通常比作为模块的代名词传到周围然后导入更干净。