Hi!
The patch adds another index to TransactionData. Speed up is only visible
for some corner cases but memory costs and added complexity are low.
Florian
>From 960ec87dae44612ef93098081bf72544c055fe2e Mon Sep 17 00:00:00 2001
From: Florian Festi <[EMAIL PROTECTED]>
Date: Tue, 7 Aug 2007 12:01:24 +0200
Subject: [PATCH] add a by name index to TransactionData to speed up matchNaevr()
---
yum/transactioninfo.py | 68 ++++++++++++++++++++---------------------------
1 files changed, 29 insertions(+), 39 deletions(-)
diff --git a/yum/transactioninfo.py b/yum/transactioninfo.py
index ce85d4f..1ae9429 100644
--- a/yum/transactioninfo.py
+++ b/yum/transactioninfo.py
@@ -35,6 +35,7 @@ class TransactionData:
self.probFilterFlags = []
self.root = '/'
self.pkgdict = {} # key = pkgtup, val = list of TransactionMember obj
+ self._namedict = {} # name -> list of TransactionMember obj
self.removedmembers = {}
self.debug = 0
self.changed = False
@@ -58,7 +59,7 @@ class TransactionData:
self.depupdated = []
def __len__(self):
- return len(self.pkgdict.values())
+ return len(self.pkgdict)
def __iter__(self):
if hasattr(self.getMembers(), '__iter__'):
@@ -84,8 +85,7 @@ class TransactionData:
for members in self.pkgdict.itervalues():
returnlist.extend(members)
elif self.pkgdict.has_key(pkgtup):
- returnlist.extend(self.pkgdict[pkgtup])
-
+ returnlist.extend(self.pkgdict[pkgtup])
return returnlist
def getRemovedMembers(self, pkgtup=None):
@@ -98,7 +98,7 @@ class TransactionData:
for members in self.removedmembers.itervalues():
returnlist.extend(members)
elif self.removedmembers.has_key(pkgtup):
- returnlist.extend(self.pkgdict[pkgtup])
+ returnlist.extend(self.removedmembers[pkgtup])
return returnlist
@@ -116,42 +116,28 @@ class TransactionData:
def matchNaevr(self, name=None, arch=None, epoch=None, ver=None, rel=None):
"""returns the list of packages matching the args above"""
- completelist = self.pkgdict.keys()
- removedict = {}
- returnlist = []
- returnmembers = []
-
- for pkgtup in completelist:
- (n, a, e, v, r) = pkgtup
- if name is not None:
- if name != n:
- removedict[pkgtup] = 1
- continue
- if arch is not None:
- if arch != a:
- removedict[pkgtup] = 1
- continue
- if epoch is not None:
- if epoch != e:
- removedict[pkgtup] = 1
- continue
- if ver is not None:
- if ver != v:
- removedict[pkgtup] = 1
- continue
- if rel is not None:
- if rel != r:
- removedict[pkgtup] = 1
- continue
-
- for pkgtup in completelist:
- if not removedict.has_key(pkgtup):
- returnlist.append(pkgtup)
-
- for matched in returnlist:
- returnmembers.extend(self.pkgdict[matched])
+ if name is None:
+ txmbrs = self.getMembers()
+ else:
+ txmbrs = self._namedict.get(name, [])
+
+ result = []
+
+ for txmbr in txmbrs:
+ (n, a, e, v, r) = txmbr.pkgtup
+ if name is not None and name != n:
+ continue
+ if arch is not None and arch != a:
+ continue
+ if epoch is not None and epoch != e:
+ continue
+ if ver is not None and ver != v:
+ continue
+ if rel is not None and rel != r:
+ continue
+ result.append(txmbr)
- return returnmembers
+ return result
def add(self, txmember):
"""add a package to the transaction"""
@@ -165,6 +151,7 @@ class TransactionData:
self.debugprint("Package in same mode, skipping.")
return
self.pkgdict[txmember.pkgtup].append(txmember)
+ self._namedict.setdefault(txmember.name, []).append(txmember)
self.changed = True
# Is this the right criteria?
@@ -191,9 +178,12 @@ class TransactionData:
self.localSack.delPackage(txmbr.po)
elif isinstance(txmbr.po, YumAvailablePackageSqlite):
self.pkgSackPackages -= 1
+ self._namedict[txmbr.name].remove(txmbr)
self.removedmembers.setdefault(pkgtup, []).extend(self.pkgdict[pkgtup])
del self.pkgdict[pkgtup]
+ if not self._namedict[pkgtup[0]]:
+ del self._namedict[pkgtup[0]]
self.changed = True
def exists(self, pkgtup):
--
1.5.2.2
_______________________________________________
Yum-devel mailing list
[email protected]
https://lists.dulug.duke.edu/mailman/listinfo/yum-devel