2011-02-12 51 views
2

进口我有许多功能模块:效率在Python

模块一

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

现在,从不同的模块,我需要进口仅函数b。为此,我使用的语法:

from One import b 

我的问题 - 旁边的命名空间的考虑,有没有在我的节目的时间复杂度的任何积极的效果,如果我使用上面,而不是import One规定的进口,因为这样我只输入必要的功能(为了举例,我只在module One中使用了3个功能,但我有更多功能)

+1

1.导入从不会对“复杂性”产生任何影响。我认为你错误地使用了“时间复杂度”这个短语。如果您询问“运行时间”,可能会产生微观影响。 2.不要优化进口,争取清晰和意义。 – 2011-02-12 13:12:58

回答

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需要解析/运行整个文件,即使其中只有一小部分被调用者实际使用。

6

否。完整模块必须完全运行(第一次)无论如何,这个名字甚至会存在于其中。

2

完整的模块被加载,想象一下:

b = 1 
def a(): 
    return b 
在我们的第二个文件

现在:

from somemodule import a 

print a()  

嗯哦

+1

这没有解决OP询问的时间。 – ash 2011-02-12 09:24:09