From 9acab0e741cd8ad5a084c70c998c6d60138908a7 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Sun, 27 Apr 2008 06:38:37 +0000 Subject: 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 --- pym/portage.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'pym') 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 -- cgit v1.2.3-1-g7c22