当模块多次导入时,python是否会优化模块?


问题内容

如果代码的某些子模块加载了大模块,那么从该名称空间引用该模块而不是再次导入该模块有什么好处?

例如:我有一个模块MyLib,该模块大量使用了ReallyBigLib。如果我有导入MyLib的代码,我应该像这样将模块挖出来

import MyLib
ReallyBigLib = MyLib.SomeModule.ReallyBigLib

要不就

import MyLib
import ReallyBigLib

问题答案:

可以将Python模块视为单例……无论您导入它们多少次,它们都只会初始化一次,因此最好这样做:

import MyLib
import ReallyBigLib

导入声明中的相关文档:

https://docs.python.org/2/reference/simple_stmts.html#the-import-
statement

一旦知道模块的名称(除非另有说明,否则术语“模块”将同时指代软件包和模块),就可以开始搜索模块或软件包。首先检查的是sys.modules,这是先前已导入的所有模块的缓存。如果在那里找到模块,则将其用于导入步骤(2)。

导入的模块缓存在sys.modules中

这是将模块名称映射到已经加载的模块的字典。可以对其进行操作以强制重新加载模块和其他技巧。请注意,从该词典中删除模块与在相应模块对象上调用reload()并不相同。