Python中导入的效率

2 投票
3 回答
753 浏览
提问于 2025-04-16 11:41

我有一个模块里面有很多函数:

模块一

def a():
 ...
def b():
 ...
def c():
 ....

现在,我想从另一个模块中只导入函数b。为此,我使用了以下语法:

from One import b

我的问题 - 除了命名空间的考虑之外,如果我使用上面提到的导入方式,而不是直接用import One,这样只导入必要的函数,是否会对我程序的时间复杂度产生积极影响?(为了举例,我在模块一中只用了3个函数,但实际上我还有很多其他函数)

3 个回答

2

整个模块必须被加载,想象一下这个场景:

b = 1
def a():
    return b

现在在我们的第二个文件里:

from somemodule import a

print a()    

哦,不!

6

不行。这个模块必须完整运行一次,才能确保里面的名字确实存在。

5

让我们通过基准测试来了解一下。首先,运行这个脚本:

#!/usr/bin/python
for i in xrange(100000):
    print "def foo%d(): pass\n" % i

这个脚本会生成一个很大的 Python 程序。我们把它保存为 foo.py

程序 import.py 只是简单地执行 import foo,重复四次:

# time python import.py

7.83s user 0.55s system 99% cpu 8.381 total
1.52s user 0.11s system 99% cpu 1.630 total
1.54s user 0.09s system 100% cpu 1.626 total
1.48s user 0.15s system 100% cpu 1.623 total

第二次(以及后面的)执行会更快,因为 Python 在第一次导入 foo 后,会创建一个文件 foo.pyc,这个文件里保存了对 foo.py 的解析结果。这会加快后续对这个模块的导入速度。

程序 fromimport.py 执行 from foo import foo1,同样重复四次:

# time python fromimport.py

7.81s user 0.44s system 99% cpu 8.253 total
1.48s user 0.15s system 100% cpu 1.626 total
1.52s user 0.11s system 99% cpu 1.631 total
1.49s user 0.14s system 100% cpu 1.630 total

这些时间和之前的程序非常相似(再次强调,第一次会比较慢,因为 Python 需要解析 foo.py),这证实了其他回答所说的,在常见场景下,import foofrom foo import foo1 之间没有显著的性能差异。

正如其他人所提到的,原因在于 Python 需要解析和运行整个文件,即使调用者只用到了其中的一小部分。

撰写回答