diff --git a/Python/import.c b/Python/import.c
index d2ed785..57521e4 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -1589,12 +1589,67 @@
     return NULL;
 }
 
+static PyObject *
+import_find_and_load(PyObject *abs_name)
+{
+    _Py_IDENTIFIER(_find_and_load);
+    PyObject *mod = NULL;
+    PyInterpreterState *interp = PyThreadState_GET()->interp;
+    int import_time = interp->core_config.import_time;
+    static int import_level;
+    static _PyTime_t accumulated;
+
+    _PyTime_t t1 = 0, accumulated_copy = accumulated;
+
+    /* XOptions is initialized after first some imports.
+     * So we can't have negative cache before completed initialization.
+     * Anyway, importlib._find_and_load is much slower than
+     * _PyDict_GetItemIdWithError().
+     */
+    if (import_time) {
+        static int header = 1;
+        if (header) {
+            fputs("import time: self [us] | cumulative | imported package\n",
+                  stderr);
+            header = 0;
+        }
+
+        import_level++;
+        t1 = _PyTime_GetPerfCounter();
+        accumulated = 0;
+    }
+
+    if (PyDTrace_IMPORT_FIND_LOAD_START_ENABLED())
+        PyDTrace_IMPORT_FIND_LOAD_START(PyUnicode_AsUTF8(abs_name));
+
+    mod = _PyObject_CallMethodIdObjArgs(interp->importlib,
+                                        &PyId__find_and_load, abs_name,
+                                        interp->import_func, NULL);
+
+    if (PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED())
+        PyDTrace_IMPORT_FIND_LOAD_DONE(PyUnicode_AsUTF8(abs_name),
+                                       mod != NULL);
+
+    if (import_time) {
+        _PyTime_t cum = _PyTime_GetPerfCounter() - t1;
+
+        import_level--;
+        fprintf(stderr, "import time: %9ld | %10ld | %*s%s\n",
+                (long)_PyTime_AsMicroseconds(cum - accumulated, _PyTime_ROUND_CEILING),
+                (long)_PyTime_AsMicroseconds(cum, _PyTime_ROUND_CEILING),
+                import_level*2, "", PyUnicode_AsUTF8(abs_name));
+
+        accumulated = accumulated_copy + cum;
+    }
+
+    return mod;
+}
+
 PyObject *
 PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
                                  PyObject *locals, PyObject *fromlist,
                                  int level)
 {
-    _Py_IDENTIFIER(_find_and_load);
     _Py_IDENTIFIER(_handle_fromlist);
     PyObject *abs_name = NULL;
     PyObject *final_mod = NULL;
@@ -1674,55 +1729,7 @@
         }
     }
     else {
-        int import_time = interp->core_config.import_time;
-        static int import_level;
-        static _PyTime_t accumulated;
-
-        _PyTime_t t1 = 0, accumulated_copy = accumulated;
-
-        /* XOptions is initialized after first some imports.
-         * So we can't have negative cache before completed initialization.
-         * Anyway, importlib._find_and_load is much slower than
-         * _PyDict_GetItemIdWithError().
-         */
-        if (import_time) {
-            static int header = 1;
-            if (header) {
-                fputs("import time: self [us] | cumulative | imported package\n",
-                      stderr);
-                header = 0;
-            }
-
-            import_level++;
-            t1 = _PyTime_GetPerfCounter();
-            accumulated = 0;
-        }
-
-        Py_XDECREF(mod);
-
-        if (PyDTrace_IMPORT_FIND_LOAD_START_ENABLED())
-            PyDTrace_IMPORT_FIND_LOAD_START(PyUnicode_AsUTF8(abs_name));
-
-        mod = _PyObject_CallMethodIdObjArgs(interp->importlib,
-                                            &PyId__find_and_load, abs_name,
-                                            interp->import_func, NULL);
-
-        if (PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED())
-            PyDTrace_IMPORT_FIND_LOAD_DONE(PyUnicode_AsUTF8(abs_name),
-                                           mod != NULL);
-
-        if (import_time) {
-            _PyTime_t cum = _PyTime_GetPerfCounter() - t1;
-
-            import_level--;
-            fprintf(stderr, "import time: %9ld | %10ld | %*s%s\n",
-                    (long)_PyTime_AsMicroseconds(cum - accumulated, _PyTime_ROUND_CEILING),
-                    (long)_PyTime_AsMicroseconds(cum, _PyTime_ROUND_CEILING),
-                    import_level*2, "", PyUnicode_AsUTF8(abs_name));
-
-            accumulated = accumulated_copy + cum;
-        }
-
+        mod = import_find_and_load(abs_name);
         if (mod == NULL) {
             goto error;
         }
