aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPJ Eby <distutils-sig@python.org>2005-12-15 18:10:10 +0000
committerPJ Eby <distutils-sig@python.org>2005-12-15 18:10:10 +0000
commit1c1bfde05a7c1729de8ea72a23f29cd9dfaa1016 (patch)
treecdb73a8ec1448b494a7423c7dbd42ca9c48f42f1
parentd989230127c6e16c505096f6150db977e61478b3 (diff)
downloadexternal_python_setuptools-1c1bfde05a7c1729de8ea72a23f29cd9dfaa1016.tar.gz
external_python_setuptools-1c1bfde05a7c1729de8ea72a23f29cd9dfaa1016.tar.bz2
external_python_setuptools-1c1bfde05a7c1729de8ea72a23f29cd9dfaa1016.zip
Improve startup performance when sys.path contains a lot of eggs, by
caching normalized versions of path entries. It appears that normalizing paths using os.path.realpath is extremely expensive on at least Windows. Caching cuts the overhead by around 30X. --HG-- branch : setuptools extra : convert_revision : svn%3A6015fed2-1504-0410-9fe1-9d1591cc4771/sandbox/trunk/setuptools%4041698
-rw-r--r--pkg_resources.py22
1 files changed, 11 insertions, 11 deletions
diff --git a/pkg_resources.py b/pkg_resources.py
index ba4cf861..cd67c20b 100644
--- a/pkg_resources.py
+++ b/pkg_resources.py
@@ -1357,7 +1357,7 @@ register_finder(object,find_nothing)
def find_on_path(importer, path_item, only=False):
"""Yield distributions accessible on a sys.path directory"""
- path_item = normalize_path(path_item)
+ path_item = _normalize_cached(path_item)
if os.path.isdir(path_item):
if path_item.lower().endswith('.egg'):
@@ -1478,9 +1478,9 @@ def file_ns_handler(importer, path_item, packageName, module):
"""Compute an ns-package subpath for a filesystem or zipfile importer"""
subpath = os.path.join(path_item, packageName.split('.')[-1])
- normalized = normalize_path(subpath)
+ normalized = _normalize_cached(subpath)
for item in module.__path__:
- if normalize_path(item)==normalized:
+ if _normalize_cached(item)==normalized:
break
else:
# Only return the path if it's not already there
@@ -1500,6 +1500,12 @@ def normalize_path(filename):
"""Normalize a file/dir name for comparison purposes"""
return os.path.normcase(os.path.realpath(filename))
+def _normalize_cached(filename,_cache={}):
+ try:
+ return _cache[filename]
+ except KeyError:
+ _cache[filename] = result = normalize_path(filename)
+ return result
def _set_parent_ns(packageName):
parts = packageName.split('.')
@@ -1509,12 +1515,6 @@ def _set_parent_ns(packageName):
setattr(sys.modules[parent], name, sys.modules[packageName])
-
-
-
-
-
-
def yield_lines(strs):
"""Yield non-empty/non-comment lines of a ``basestring`` or sequence"""
if isinstance(strs,basestring):
@@ -1876,7 +1876,7 @@ class Distribution(object):
#@classmethod
def from_filename(cls,filename,metadata=None):
return cls.from_location(
- normalize_path(filename), os.path.basename(filename), metadata
+ _normalize_cached(filename), os.path.basename(filename), metadata
)
from_filename = classmethod(from_filename)
@@ -1915,7 +1915,7 @@ class Distribution(object):
self.check_version_conflict()
best, pos = 0, -1
for p,item in enumerate(path):
- item = normalize_path(item)
+ item = _normalize_cached(item)
if loc.startswith(item) and len(item)>best and loc<>item:
best, pos = len(item), p
if pos==-1: