我有这个结构:
.
└── module
├── __init__.py
└── submodule
├── __init__.py
├── foo.py
└── bar.py
在module.submodule.__init__.py
我有这个:
import foo
import bar
在module.submodule.foo.py
我有这个:
import very_heavy_third_party_module as vhtpm
...
我只想导入bar
,但我被foo
放慢了速度(让我们假设time.sleep(3)
和{{1}都有一个丑陋的foo
})。
所以我的目标是在下面写这个,而不会被模块的其他部分放慢速度:
module/__init__.py
如何导入位于子模块from module.submodule.bar import saybar
saybar()
中的saybar
?
答案 0 :(得分:3)
从bar
导入而不运行foo
的唯一方法是从import foo
删除module.submodule.__init__.py
。这是因为当您在Python中导入包/模块时,将运行该模块中的所有顶级代码(如果导入包,则为__init__.py
)。当您运行from module.submodule.bar import saybar
时,所有顶级代码都在:
module.__init__.py
module.submodule.__init__.py
module.submodule.bar.py
正在运行。由于module.submodule.__init__.py
包含import foo
,因此会导入foo
,并且所有顶级代码(包括import very_heavy_third_party_module as vhtpm
)都会运行,从而导致速度减慢。
一些可能的解决方案是:
__init__.py
移出尽可能多的代码。将__init__.py
留空是常见的做法 - 如果有一些功能,您可能需要考虑将其移动到自己的模块。一旦import
行是唯一剩余的行,您就可以删除它们,因为它们在命名空间方面没有任何区别。import vhtpm
中的foo.py
从顶层向下重新定位(例如,转换为模块中其他内容调用的函数)。这不是很干净,但如果您需要优化,可能对您有用。