我有一个具有许多功能的模块:
模块1
def a():
...
def b():
...
def c():
....现在,从另一个模块中,我只需要导入函数b。为此,我使用了以下语法:
from One import b我的问题-除了名称空间考虑之外,如果我使用上述导入而不是import One,是否对程序的时间复杂性有任何积极影响?因为这样我只导入必要的函数(为了示例,我只在module One中使用了3个函数,但我还有更多)。
发布于 2011-02-12 09:24:52
让我们通过基准来找出答案。从脚本开始:
#!/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.py的结果)之后会增加文件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需要解析/运行整个文件,即使调用者实际上只使用了其中的一小部分。
发布于 2011-02-12 09:14:34
不是的。完整的模块必须完全运行(第一次),以确保名称甚至将存在于其中,不管如何。
发布于 2011-02-12 09:17:12
必须加载整个模块,设想如下:
b = 1
def a():
return b现在在我们的第二个文件中:
from somemodule import a
print a() 啊哦
https://stackoverflow.com/questions/4977268
复制相似问题