整理重的Python导入
我大约有25%的代码依赖于一些模块,比如Traits、tvtk等,这些模块导入起来比较重。在我的电脑上,通常需要花费大约2秒钟的时间(在其他电脑上可能更久)。
我的模块组织结构如下:
mainmodule
|--submodule1
|--submodule2
|--subsubmodule1
|--subsubmodule2
|--submodule3
|--submodule4
|--subsubmodule1
|--subsubmodule2
在这些模块中,submodule1和submodule2使用了Traits。这意味着每次我调用import mainmodule时,75%的时间都要等着这些重模块被导入,但实际上它们并不会被用到。
我该如何组织我的导入,以减少导入时间呢?
也许可以尝试这样做:
import mainmodule
然后得到:
mainmodule
|--submodule3
|--submodule4
|--subsubmodule1
|--subsubmodule2
最后只调用:
import mainmodule.heavy
这样就能得到所有内容。
2 个回答
3
你可以在一个函数或模块里面写一些像这样的代码:
def heavy():
global x
global y
import x, y
def mainmodule():
if heavy not in globals():
import heavy
其实,这样在同一个程序里是行不通的,因为函数是不能被导入的。而且,你应该在全局变量中检查一个字符串,而不是在模块里面。所以,正确的做法是:
def heavy():
global x
global y
import x, y
def mainmodule():
if 'x' not in globals() or 'y' not in globals():
heavy()
3
听起来你想要的是一种方法,让导入 mainmodule
时,不会自动导入 submodule1
和 submodule2
,因为它们加载起来很慢。
其实这很简单。你可以只在需要使用 submodule1
和 submodule2
的函数里导入它们。或者把这些函数放到一个叫 mainmodule_heavy.py
的单独模块里。
(或者你可以 对 Python 模块系统进行一些小改动,让模块按需加载。不过这种改动往往会引发问题,而且在你的情况下似乎没必要。)