Mercurial > cpython-lru_cache-weakref
diff Python/import.c @ 38388:d21896b2dd0a legacy-trunk
Need for speed: Patch #921466 : sys.path_importer_cache is now used to cache valid and
invalid file paths for the built-in import machinery which leads to
fewer open calls on startup.
Also fix issue with PEP 302 style import hooks which lead to more open()
calls than necessary.
| author | Georg Brandl <georg@python.org> |
|---|---|
| date | Fri, 26 May 2006 18:03:31 +0000 |
| parents | 1fdf29a88f0e |
| children | 3204aa9e2b22 |
line wrap: on
line diff
--- a/Python/import.c Fri May 26 17:47:40 2006 +0000 +++ b/Python/import.c Fri May 26 18:03:31 2006 +0000 @@ -1240,7 +1240,33 @@ if (importer == NULL) return NULL; /* Note: importer is a borrowed reference */ - if (importer != Py_None) { + if (importer == Py_False) { + /* Cached as not being a valid dir. */ + Py_XDECREF(copy); + continue; + } + else if (importer == Py_True) { + /* Cached as being a valid dir, so just + * continue below. */ + } + else if (importer == Py_None) { + /* No importer was found, so it has to be a file. + * Check if the directory is valid. */ +#ifdef HAVE_STAT + if (stat(buf, &statbuf) != 0) { + /* Directory does not exist. */ + PyDict_SetItem(path_importer_cache, + v, Py_False); + Py_XDECREF(copy); + continue; + } else { + PyDict_SetItem(path_importer_cache, + v, Py_True); + } +#endif + } + else { + /* A real import hook importer was found. */ PyObject *loader; loader = PyObject_CallMethod(importer, "find_module", @@ -1253,9 +1279,11 @@ return &importhookdescr; } Py_DECREF(loader); + Py_XDECREF(copy); + continue; } - /* no hook was successful, use builtin import */ } + /* no hook was found, use builtin import */ if (len > 0 && buf[len-1] != SEP #ifdef ALTSEP
