summaryrefslogtreecommitdiff
path: root/apt
diff options
context:
space:
mode:
authorMartin Pitt <martin.pitt@canonical.com>2010-06-25 16:10:13 +0200
committerMartin Pitt <martin.pitt@canonical.com>2010-06-25 16:10:13 +0200
commit337fec14957b98c01bc61a5b516bcf8cd98ccb82 (patch)
tree52d3bd94c02ae9be75fb11bfd423043ef10838cc /apt
parent2c39f0847c8f32b93cac8d450d30b657548bafd4 (diff)
downloadpython-apt-337fec14957b98c01bc61a5b516bcf8cd98ccb82.tar.gz
apt/cache.py: When iterating over the cache, do so sorted by package name.
With this we read the the package lists linearly if we need to access the package records, instead of having to do thousands of random seeks; the latter is disastrous if we use compressed package indexes, and slower than necessary for uncompressed indexes.
Diffstat (limited to 'apt')
-rw-r--r--apt/cache.py12
1 files changed, 11 insertions, 1 deletions
diff --git a/apt/cache.py b/apt/cache.py
index 8e07e4d0..3679e4ba 100644
--- a/apt/cache.py
+++ b/apt/cache.py
@@ -64,6 +64,7 @@ class Cache(object):
self._callbacks = {}
self._weakref = weakref.WeakValueDictionary()
self._set = set()
+ self._sorted_set = None
if memonly:
# force apt to build its caches in memory
apt_pkg.config.set("Dir::Cache::pkgcache", "")
@@ -126,6 +127,7 @@ class Cache(object):
self._list = apt_pkg.SourceList()
self._list.read_main_list()
self._set.clear()
+ self._sorted_set = None
self._weakref.clear()
progress.op = _("Building data structures")
@@ -157,7 +159,15 @@ class Cache(object):
raise KeyError('The cache has no package named %r' % key)
def __iter__(self):
- for pkgname in self._set:
+ # We iterate sorted over package names here. With this we read the
+ # package lists linearly if we need to access the package records,
+ # instead of having to do thousands of random seeks; the latter
+ # is disastrous if we use compressed package indexes, and slower than
+ # necessary for uncompressed indexes.
+ if self._sorted_set is None:
+ self._sorted_set = sorted(self._set)
+
+ for pkgname in self._sorted_set:
yield self[pkgname]
raise StopIteration