diff options
author | Guido van Rossum <guido@python.org> | 1997-09-06 20:29:52 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1997-09-06 20:29:52 (GMT) |
commit | f5f5fdbdd05c187dd56e5f36f3e2e7f27948f944 (patch) | |
tree | c51cc96eb6a55ecba89e21e51c70067891aeaad2 /Python | |
parent | 81da02e6aa7b3400ef06b76c6329cc0cd0216414 (diff) | |
download | cpython-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.)
Diffstat (limited to 'Python')
-rw-r--r-- | Python/import.c | 25 |
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; |