Python中导入的效率
我有一个模块里面有很多函数:
模块一
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 foo
和 from foo import foo1
之间没有显著的性能差异。
正如其他人所提到的,原因在于 Python 需要解析和运行整个文件,即使调用者只用到了其中的一小部分。