diff options
| author | Jack Amadeo <jamadeo@gmail.com> | 2017-10-01 17:54:09 -0400 |
|---|---|---|
| committer | Dan Schult <dschult@colgate.edu> | 2017-10-01 17:54:09 -0400 |
| commit | c3b0761f96cb85d2c4d4b8c7bf6fe451c17fb961 (patch) | |
| tree | a2b24e1722c2349ca8a89ad4ba00ff548cd4a58e | |
| parent | 6bdf9810667bedd2712cb7ad73ebee34a8abb8bd (diff) | |
| download | networkx-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.py | 4 |
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): |
