在Python中,标准导入和上下文导入哪个更有效?

4

如果这个问题看起来很基础,我提前道歉。

在Python中,哪种方式被认为更高效:

标准导入

import logging

try:
  ...some code...
exception Exception, e:
  logging.error(e)

上下文导入

try:
  ...some code...
exception Exception, e:
  import logging
  logging.error(e)

1
我不确定你的导入效率真的是你应该花费性能时间的地方。如果你有一个单独的模块在拖慢启动时间,考虑重构它,使其在需要时执行计算密集型任务,而不是在加载时执行。 - Aaron Maenpaa
我从未说过这会导致减速。我只是对这个话题的共识感到好奇。 - Huuuze
5个回答

6

上下文导入在技术上更有效,但我认为它们可能会带来其他问题。

如果稍后您想添加类似的except子句,则现在有两个地方需要维护相同的代码块。您还需要测试异常处理程序,以确保第一个导入不会在代码中引起任何未预料的问题。


2
只有在很少或从不使用时,它们才更有效率。 - S.Lott
没错,我假设导入操作很少发生,否则就没有意义了。正如你所指出的,条件导入可能是更好的选择,并且在处理多个库版本时非常常见。 - JimB

3

这是一种微优化。不用担心。


我会补充一点,关于在进行性能分析之后再进行优化。(否则,答案完美无缺) - Ali Afshar

3
这取决于您执行上下文导入的频率。
一个import语句需要检查模块是否存在,这是一项非常耗费资源的操作。
大量的上下文导入将会对性能造成损害,并且不会在简单性方面带来实质性的好处。除非您真的确定导入很少或根本不会被使用,否则几乎没有好处。
特别是当上下文导入是在顶层完成(即只做一次)时,在if语句内进行上下文导入是有意义的。
if someConfig:
    import this as bigDeal
else:
    import that as bigDeal

2

它们本质上是相同的。Python解释器只会加载一个被使用的模块一次,无论你导入它多少次。改变导入语句的位置只会影响名称绑定的位置——例如,如果您的import语句在函数内部,则该名称只能在该函数中使用。

通常情况下,导入语句应尽可能靠近文件的“顶部”。


虽然在给出的例子中,上下文导入的区别是模块 -仅- 在异常发生时加载。 - Matthew Trevor

1
这两种方法的性能差异实际上非常小。我从未见过有任何情况下这会对程序的性能产生显著影响。
值得记住的是,Python解释器只会在第一次导入模块时执行解析任务。
通常,如果你在文件顶部导入所有需要的模块,你将会拥有更易于维护的代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接