]> granicus.if.org Git - python/commitdiff
Significant speedup -- when a submodule imports a global module, add a
authorGuido van Rossum <guido@python.org>
Sat, 6 Sep 1997 20:29:52 +0000 (20:29 +0000)
committerGuido van Rossum <guido@python.org>
Sat, 6 Sep 1997 20:29:52 +0000 (20:29 +0000)
dummy entry to sys.modules, marking the absence of a submodule by the
same name.

Thus, if module foo.bar executes the statement "import time",
sys.modules['foo.time'] will be set to None, once the absence of a
module foo.time is confirmed (by looking for it in foo's path).

The next time when foo.bar (or any other submodule of foo) executes
"import time", no I/O is necessary to determine that there is no
module foo.time.

(Justification: It may seem strange to pollute sys.modules.  However,
since we're doing the lookup anyway it's definitely the fastest
solution.  This is the same convention that 'ni' uses and I haven't
heard any complaints.)

Python/import.c

index d62815eabe38da93db6503c2de1b9abeef4c5ea4..a53abaebb135022a657c98aca4ae86ff129b0d72 100644 (file)
@@ -998,6 +998,7 @@ static PyObject *get_parent Py_PROTO((PyObject *globals,
                                      char *buf, int *p_buflen));
 static PyObject *load_next Py_PROTO((PyObject *mod, PyObject *altmod,
                                     char **p_name, char *buf, int *p_buflen));
+static int mark_miss Py_PROTO((char *name));
 static int ensure_fromlist Py_PROTO((PyObject *mod, PyObject *fromlist,
                                     char *buf, int buflen));
 static PyObject * import_submodule Py_PROTO((PyObject *mod,
@@ -1168,11 +1169,17 @@ load_next(mod, altmod, p_name, buf, p_buflen)
        result = import_submodule(mod, p, buf);
        if (result == Py_None && altmod != mod) {
                Py_DECREF(result);
-               /* Here, altmod must be None */
-               strncpy(buf, name, len);
-               buf[len] = '\0';
-               *p_buflen = len;
-               result = import_submodule(altmod, buf, buf);
+               /* Here, altmod must be None and mod must not be None */
+               result = import_submodule(altmod, name, name);
+               if (result != NULL && result != Py_None) {
+                       if (mark_miss(buf) != 0) {
+                               Py_DECREF(result);
+                               return NULL;
+                       }
+                       strncpy(buf, name, len);
+                       buf[len] = '\0';
+                       *p_buflen = len;
+               }
        }
        if (result == NULL)
                return NULL;
@@ -1187,6 +1194,14 @@ load_next(mod, altmod, p_name, buf, p_buflen)
        return result;
 }
 
+static int
+mark_miss(name)
+       char *name;
+{
+       PyObject *modules = PyImport_GetModuleDict();
+       return PyDict_SetItemString(modules, name, Py_None);
+}
+
 static int
 ensure_fromlist(mod, fromlist, buf, buflen)
        PyObject *mod;