summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1997-09-06 20:29:52 (GMT)
committerGuido van Rossum <guido@python.org>1997-09-06 20:29:52 (GMT)
commitf5f5fdbdd05c187dd56e5f36f3e2e7f27948f944 (patch)
treec51cc96eb6a55ecba89e21e51c70067891aeaad2
parent81da02e6aa7b3400ef06b76c6329cc0cd0216414 (diff)
downloadcpython-f5f5fdbdd05c187dd56e5f36f3e2e7f27948f944.zip
cpython-f5f5fdbdd05c187dd56e5f36f3e2e7f27948f944.tar.gz
cpython-f5f5fdbdd05c187dd56e5f36f3e2e7f27948f944.tar.bz2
Significant speedup -- when a submodule imports a global module, add a
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.)
-rw-r--r--Python/import.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/Python/import.c b/Python/import.c
index d62815e..a53abae 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -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;
@@ -1188,6 +1195,14 @@ load_next(mod, altmod, p_name, buf, p_buflen)
}
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;
PyObject *fromlist;