导入语句应该总是在模块顶部吗?
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
的懒加载框架。