导入语句应该总是在模块顶部吗?

546 投票
22 回答
185398 浏览
提问于 2025-04-11 09:24

PEP 8 里说:

导入的内容总是放在文件的最上面,紧接着模块的注释和文档字符串,然后是模块的全局变量和常量。

但是,如果我导入的类、方法或函数只在少数情况下用到,那是不是在需要的时候再导入会更有效率呢?

这样做:

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()

22 个回答

385

模块导入的速度很快,但不是瞬间完成的。这意味着:

  • 把导入放在模块的最上面是没问题的,因为这只是一次性的微小开销。
  • 如果把导入放在一个函数里面,那么每次调用这个函数时就会花更多时间。

所以如果你在意效率,就把导入放在最上面。只有在你分析过代码性能,发现这样做能提高效率时,才考虑把导入放到函数里面(你有分析过性能,看看哪里可以改进,对吧??)


我见过的进行懒加载导入的最好理由有:

  • 可选的库支持。如果你的代码有多条路径使用不同的库,确保在某个可选库没有安装时不会出错。
  • 在插件的 __init__.py 文件中,这个文件可能会被导入但实际上并不使用。比如Bazaar插件,它们使用 bzrlib 的懒加载框架。

撰写回答