diff options
author | Zac Medico <zmedico@gentoo.org> | 2008-04-27 06:38:37 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2008-04-27 06:38:37 +0000 |
commit | 9acab0e741cd8ad5a084c70c998c6d60138908a7 (patch) | |
tree | 44145b0eeb18fa2cf4a5fa10fb390d2780b6e65f /pym | |
parent | 20d63d57219657a14be2ba0333180ff82abb88d9 (diff) | |
download | portage-9acab0e741cd8ad5a084c70c998c6d60138908a7.tar.gz portage-9acab0e741cd8ad5a084c70c998c6d60138908a7.tar.bz2 portage-9acab0e741cd8ad5a084c70c998c6d60138908a7.zip |
Create a digraph.difference_update() method and use it to amortize the
cost of removing nodes from the digraph.order list. (trunk r9992)
svn path=/main/branches/2.1.2/; revision=9993
Diffstat (limited to 'pym')
-rw-r--r-- | pym/portage.py | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/pym/portage.py b/pym/portage.py index f11e8877e..9dd0ecd92 100644 --- a/pym/portage.py +++ b/pym/portage.py @@ -391,6 +391,26 @@ class digraph: del self.nodes[node] self.order.remove(node) + def difference_update(self, t): + """ + Remove all given nodes from node_set. This is more efficient + than multiple calls to the remove() method. + """ + if isinstance(t, (list, tuple)) or \ + not hasattr(t, "__contains__"): + t = frozenset(t) + order = [] + for node in self.order: + if node not in t: + order.append(node) + continue + for parent in self.nodes[node][1]: + del self.nodes[parent][0][node] + for child in self.nodes[node][0]: + del self.nodes[child][1][node] + del self.nodes[node] + self.order = order + def remove_edge(self, child, parent): """ Remove edge in the direction from child to parent. Note that it is |