导入模块不会浪费任何东西 ; 该模块始终完全导入(导入到sys.modules
映射中),因此无论您使用import sys
还是from sys import argv
不成问题。
这两个语句之间的唯一区别是绑定的名称。import sys
将名称绑定sys
到模块(so- sys
> sys.modules['sys']
),同时from sys import argv
绑定不同的名称,argv
直接指向模块内部包含的属性(so- argv
> sys.modules['sys'].argv
)。sys
无论您是否使用模块中的任何其他模块,模块的其余部分仍然存在。
两种方法之间也没有性能差异。是的,sys.argv
必须查找两件事;它必须sys
在全局名称空间中查找(找到模块),然后查找attribute argv
。是的,通过使用,from sys import argv
您可以跳过属性查找,因为您已经直接引用了该属性。但是该import
语句仍然必须执行该工作,在导入时它会查找相同的属性,并且您只需要使用argv
一次即可。如果您必须argv
在循环中使用数千次,则可能会有所不同,但是在这种特定情况下,实际上没有。
那么,在一个或另一个之间的选择应该基于编码样式。
在大型模块中,我肯定会使用import sys
; 代码文档很重要,sys.argv
在大型模块中的某处使用将使您所指的内容比argv
以往更加清晰。
如果您使用的唯一位置argv
是在'__main__'
块中调用main()
函数,from sys import argv
则一定要使用,如果您对此感到更高兴:
if __name__ == '__main__':
from sys import argv
main(argv)
我仍然会在import sys
那里自己使用。所有事物都是平等的(就性能和用于编写它的字符数而言,它们都是准确的),对我来说,这更容易些。
如果您要完全导入其他内容,那么性能可能会发挥作用。但是仅当您在某个模块中多次使用特定名称时(例如在关键循环中)。但是,然后(在函数内)创建本地名称仍然会更快:
import somemodule
def somefunction():
localname = somemodule.somefunctionorother
while test:
# huge, critical loop
foo = localname(bar)