一尘不染

Python-导入语句是否应该始终位于模块的顶部?

python

导入总是放在文件的顶部,紧随任何模块注释和文档字符串之后,以及模块全局变量和常量之前。

但是,如果我要导入的类/方法/函数仅在极少数情况下使用,那么确定在需要时进行导入肯定会更有效吗?

这不是吗?

class SomeClass(object):

    def not_often_called(self)
        from datetime import datetime
        self.datetime = datetime.now()

比这更有效?

from datetime import datetime

class SomeClass(object):

    def not_often_called(self)
        self.datetime = datetime.now()

阅读 460

收藏
2020-02-13

共1个答案

一尘不染

模块导入非常快,但不是即时的。这意味着:

  • 将导入放在模块顶部很好,因为这是微不足道的成本,只需要支付一次即可。
  • 将导入放在函数中将导致对该函数的调用花费更长时间。
    因此,如果你关心效率,则将进口放在首位。仅在你的剖析显示有帮助的情况下,才将它们移入函数中(你进行了剖析以查看最能改善性能的地方,对吗?)

我见过执行延迟导入的最佳原因是:

  • 可选的库支持。如果你的代码具有使用不同库的多个路径,则在未安装可选库的情况下不要中断。
  • __init__.py插件的中,可能已导入但并未实际使用。例如Bazaar插件,它使用bzrlib的延迟加载框架。
2020-02-13