整理重的Python导入

2 投票
2 回答
966 浏览
提问于 2025-04-16 09:36

我大约有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 时,不会自动导入 submodule1submodule2,因为它们加载起来很慢。

其实这很简单。你可以只在需要使用 submodule1submodule2 的函数里导入它们。或者把这些函数放到一个叫 mainmodule_heavy.py 的单独模块里。

(或者你可以 对 Python 模块系统进行一些小改动,让模块按需加载。不过这种改动往往会引发问题,而且在你的情况下似乎没必要。)

撰写回答