bpo-32596: Lazy import concurrent.futures.process and thread (GH-5241)

diff --git a/Lib/concurrent/futures/__init__.py b/Lib/concurrent/futures/__init__.py
index ba8de16..72aca81 100644
--- a/Lib/concurrent/futures/__init__.py
+++ b/Lib/concurrent/futures/__init__.py
@@ -15,5 +15,36 @@
                                       Executor,
                                       wait,
                                       as_completed)
-from concurrent.futures.process import ProcessPoolExecutor
-from concurrent.futures.thread import ThreadPoolExecutor
+
+__all__ = (
+    'FIRST_COMPLETED',
+    'FIRST_EXCEPTION',
+    'ALL_COMPLETED',
+    'CancelledError',
+    'TimeoutError',
+    'BrokenExecutor',
+    'Future',
+    'Executor',
+    'wait',
+    'as_completed',
+    'ProcessPoolExecutor',
+    'ThreadPoolExecutor',
+)
+
+
+def __dir__():
+    return __all__ + ('__author__', '__doc__')
+
+
+def __getattr__(name):
+    global ProcessPoolExecutor, ThreadPoolExecutor
+
+    if name == 'ProcessPoolExecutor':
+        from .process import ProcessPoolExecutor
+        return ProcessPoolExecutor
+
+    if name == 'ThreadPoolExecutor':
+        from .thread import ThreadPoolExecutor
+        return ThreadPoolExecutor
+
+    raise AttributeError(f"module {__name__} has no attribute {name}")
diff --git a/Misc/NEWS.d/next/Library/2018-01-19-19-57-45.bpo-32596.4aVIie.rst b/Misc/NEWS.d/next/Library/2018-01-19-19-57-45.bpo-32596.4aVIie.rst
new file mode 100644
index 0000000..a90f7d1
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-01-19-19-57-45.bpo-32596.4aVIie.rst
@@ -0,0 +1,4 @@
+``concurrent.futures`` imports ``ThreadPoolExecutor`` and
+``ProcessPoolExecutor`` lazily (using :pep:`562`).
+It makes ``import asyncio`` about 15% faster because asyncio
+uses only ``ThreadPoolExecutor`` by default.