我有一个包含许多功能的模块:
第一单元
def a():
...
def b():
...
def c():
....
现在,从另一个模块,我只需要导入函数b。为此,我使用语法:
from One import b
我的问题 - 除了名称空间注意事项之外,如果我使用上面描述的导入而不是import One
,对我的程序的时间复杂性有任何积极影响,因为这样我只会导入必要的函数(为了示例我在module One
中仅使用了3个函数,但我还有更多函数)
答案 0 :(得分:6)
没有。完整模块必须完全运行(第一次),以确保该名称甚至可以存在于其中。
答案 1 :(得分: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.pyc
后折叠文件foo
,其中包含解析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需要解析/运行整个文件,即使调用者实际只使用了其中的一小部分。
答案 2 :(得分:2)
必须加载完整的模块,想象一下:
b = 1
def a():
return b
现在在我们的第二个档案中:
from somemodule import a
print a()
哦哦