Asked By – Adam J. Forster
PEP 8 states:
Imports are always put at the top of the file, just after any module comments and docstrings, and before module globals and constants.
However if the class/method/function that I am importing is only used in rare cases, surely it is more efficient to do the import when it is needed?
class SomeClass(object): def not_often_called(self) from datetime import datetime self.datetime = datetime.now()
more efficient than this?
from datetime import datetime class SomeClass(object): def not_often_called(self) self.datetime = datetime.now()
Now we will see solution for issue: Should import statements always be at the top of a module?
Module importing is quite fast, but not instant. This means that:
- Putting the imports at the top of the module is fine, because it’s a trivial cost that’s only paid once.
- Putting the imports within a function will cause calls to that function to take longer.
So if you care about efficiency, put the imports at the top. Only move them into a function if your profiling shows that would help (you did profile to see where best to improve performance, right??)
The best reasons I’ve seen to perform lazy imports are:
- Optional library support. If your code has multiple paths that use different libraries, don’t break if an optional library is not installed.
- In the
__init__.pyof a plugin, which might be imported but not actually used. Examples are Bazaar plugins, which use
bzrlib‘s lazy-loading framework.