diff --git a/kwant/__init__.py b/kwant/__init__.py
index 054657c308607608b1c9c8a893680231b21c59f6..d8c88ebf2b9c70ff3da0cfdf6d1e2e4c9e7029dc 100644
--- a/kwant/__init__.py
+++ b/kwant/__init__.py
@@ -29,22 +29,29 @@ except ImportError:
         raise
 
 from ._common import KwantDeprecationWarning, UserCodeError
-
 __all__.extend(['KwantDeprecationWarning', 'UserCodeError'])
 
-for module in ['system', 'builder', 'lattice', 'solvers', 'digest', 'rmt',
-               'operator', 'kpm', 'wraparound']:
-    exec('from . import {0}'.format(module))
-    __all__.append(module)
+# Pre-import most submodules.  (We make exceptions for submodules that have
+# special dependencies or where that would take too long.)
+from . import system
+from . import builder
+from . import lattice
+from . import solvers
+from . import digest
+from . import rmt
+from . import operator
+from . import kpm
+from . import wraparound
+__all__.extend(['system', 'builder', 'lattice', 'solvers', 'digest', 'rmt',
+                'operator', 'kpm', 'wraparound'])
 
 # Make selected functionality available directly in the root namespace.
-available = [('builder', ['Builder', 'HoppingKind']),
-             ('lattice', ['TranslationalSymmetry']),
-             ('solvers.default',
-              ['smatrix', 'greens_function', 'ldos', 'wave_function'])]
-for module, names in available:
-    exec('from .{0} import {1}'.format(module, ', '.join(names)))
-    __all__.extend(names)
+from .builder import Builder, HoppingKind
+__all__.extend(['Builder', 'HoppingKind'])
+from .lattice import TranslationalSymmetry
+__all__.extend(['TranslationalSymmetry'])
+from .solvers.default import smatrix, greens_function, ldos, wave_function
+__all__.extend(['smatrix', 'greens_function', 'ldos', 'wave_function'])
 
 # Importing plotter might not work, but this does not have to be a problem --
 # only no plotting will be available.
diff --git a/kwant/continuum/__init__.py b/kwant/continuum/__init__.py
index c445f440d3346c7add5e277d3915c964cb0afad6..fd08848f69cfae23f6e6612e74167427c675f8e3 100644
--- a/kwant/continuum/__init__.py
+++ b/kwant/continuum/__init__.py
@@ -15,6 +15,5 @@ except ImportError as error:
            "dependencies is not installed.")
     raise ImportError(msg) from error
 
-
 __all__ = ['discretize', 'discretize_symbolic', 'build_discretized',
            'sympify', 'lambdify', 'momentum_operators', 'position_operators']
diff --git a/kwant/graph/__init__.py b/kwant/graph/__init__.py
index 950ded757083fb016137cfc24d598a87c85db8ea..2ea8e96396789bb7627d199adce479806a6e416f 100644
--- a/kwant/graph/__init__.py
+++ b/kwant/graph/__init__.py
@@ -9,8 +9,7 @@
 """Functionality for graphs"""
 
 # Merge the public interface of all submodules.
-__all__ = []
-for module in ['core', 'defs']:
-    exec('from . import {0}'.format(module))
-    exec('from .{0} import *'.format(module))
-    exec('__all__.extend({0}.__all__)'.format(module))
+from .core import *
+from .defs import *
+
+__all__ = [core.__all__ + defs.__all__]
diff --git a/kwant/linalg/__init__.py b/kwant/linalg/__init__.py
index cd46cf5aab99934e9c73282c42b1ff3700835433..2456b350965ca6281e9418c1638a88e8445a005f 100644
--- a/kwant/linalg/__init__.py
+++ b/kwant/linalg/__init__.py
@@ -10,7 +10,10 @@ __all__ = ['lapack']
 from . import lapack
 
 # Merge the public interface of the other submodules.
-for module in ['decomp_lu', 'decomp_ev', 'decomp_schur']:
-    exec('from . import {0}'.format(module))
-    exec('from .{0} import *'.format(module))
-    exec('__all__.extend({0}.__all__)'.format(module))
+from .decomp_lu import *
+from .decomp_schur import *
+from .decomp_ev import *
+
+__all__.extend([decomp_lu.__all__,
+                decomp_ev.__all__,
+                decomp_schur.__all__])
diff --git a/kwant/physics/__init__.py b/kwant/physics/__init__.py
index d59fc85e3f6f531df879fde2d50e46b3dd3fb5ca..199d68d230293f932f2ce82eeddfe60f69f90536 100644
--- a/kwant/physics/__init__.py
+++ b/kwant/physics/__init__.py
@@ -8,8 +8,14 @@
 """Physics-related algorithms"""
 
 # Merge the public interface of all submodules.
-__all__ = []
-for module in ['leads', 'dispersion', 'noise', 'symmetry', 'gauge']:
-    exec('from . import {0}'.format(module))
-    exec('from .{0} import *'.format(module))
-    exec('__all__.extend({0}.__all__)'.format(module))
+from .leads import *
+from .dispersion import *
+from .noise import *
+from .symmetry import *
+from .gauge import *
+
+__all__ = [leads.__all__
+           + dispersion.__all__
+           + noise.__all__
+           + symmetry.__all__
+           + gauge.__all__]