summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Amadeo <jamadeo@gmail.com>2017-10-01 17:54:09 -0400
committerDan Schult <dschult@colgate.edu>2017-10-01 17:54:09 -0400
commitc3b0761f96cb85d2c4d4b8c7bf6fe451c17fb961 (patch)
treea2b24e1722c2349ca8a89ad4ba00ff548cd4a58e
parent6bdf9810667bedd2712cb7ad73ebee34a8abb8bd (diff)
downloadnetworkx-c3b0761f96cb85d2c4d4b8c7bf6fe451c17fb961.tar.gz
Improve subgraph node iteration (#2687)
The show_nodes() filter creates a set from an iterable container. However, FilterAtlas will always traverse the entire node set, even though the set of nodes is available in this newly constructed set. This change dramatically speeds up node iteration when the subgraph is much smaller than the graph.
-rw-r--r--networkx/classes/coreviews.py4
1 files changed, 4 insertions, 0 deletions
diff --git a/networkx/classes/coreviews.py b/networkx/classes/coreviews.py
index b942842b..73f37ec5 100644
--- a/networkx/classes/coreviews.py
+++ b/networkx/classes/coreviews.py
@@ -286,9 +286,13 @@ class FilterAtlas(Mapping): # nodedict, nbrdict, keydict
self.NODE_OK = NODE_OK
def __len__(self):
+ if hasattr(self.NODE_OK, 'nodes'):
+ return len(self.NODE_OK.nodes & set(self._atlas.keys()))
return sum(1 for n in self._atlas if self.NODE_OK(n))
def __iter__(self):
+ if hasattr(self.NODE_OK, 'nodes'):
+ return iter(self.NODE_OK.nodes & set(self._atlas.keys()))
return (n for n in self._atlas if self.NODE_OK(n))
def __getitem__(self, key):