基本上,我想知道在每个模块中导入标准库是否比在模块中导入标准模块一次并在其他模块中重用它更好/更差。换句话说,我想知道以下两个代码之间是否存在速度/性能差异:
"""
One way - Just importing time module only once
"""
# /usr/bin/python
# mytime.py
import time
def get_time():
return time.time()
# /usr/bin/python
# usingtime.py
import mytime
print (mytime.time() - mytime.time.time())
"""
Another way - importing time module as needed
"""
# /usr/bin/python
# mytime.py
import time
def get_time():
return time.time()
# /usr/bin/python
# usingtime.py
import time
import mytime
print (mytime.time() - time.time())
哪个代码更好?或者它真的重要吗?
答案 0 :(得分:2)
在第二个例子中没有理由重新导入time
,这实际上就是你正在做的事情。为了优雅,您应该只在(直接)使用它的同一模块中导入模块。
想象一下,导入3级深度(一个模块导入另一个导入另一个模块的模块......)并跟踪第一个顶层模块中的所有导入!维持这将是一场噩梦。
就速度而言,我相信重新导入的性能可以忽略不计。导入多次时,Python解释器不会完全重新导入。
答案 1 :(得分:1)
来自:http://docs.python.org/reference/simple_stmts.html#the-import-statement
首先检查的是sys.modules,即所有模块的缓存 以前进口过。如果在那里找到模块那么它就是 用于导入步骤(2)。
通过导入加载的模块基本上是单例。在第一次导入模块时,将执行模块全局作用域中的代码(模块的初始化),并将模块实例添加到sys.modules中。任何其他模块中的下一个导入将仅引用此初始化实例。成本可以忽略不计。
琐碎的例子:
<强> a.py 强>
print "HELLO"
<强> b.py 强>
import a
import c
<强> c.py 强>
import a
在互动口译中:
Python 2.6.6 (r266:84297, Aug 24 2010, 18:13:38) [MSC v.1500 64 bit (AMD64)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import b
HELLO
>>>
(注意“HELLO”仅打印一次)