@@ -257,6 +257,38 @@ def test_full_subgraph(self):
257257 self .assertCountEqual (vertices , [1 , 2 , 3 , 4 , 5 ])
258258 self .assertEqual (len (edges ), 5 )
259259
260+ def test_full_subgraph_large_from_list (self ):
261+ # An earlier version of full_subgraph had quadratic-time behaviour.
262+ vertex_count = 20000
263+ vertices = set (range (vertex_count ))
264+ edge_mapper = {
265+ n : [(n + 1 ) % vertex_count , (n + 1 ) % vertex_count ]
266+ for n in vertices
267+ }
268+ graph = DirectedGraph .from_out_edges (
269+ vertices = vertices ,
270+ edge_mapper = edge_mapper ,
271+ )
272+ subgraph = graph .full_subgraph (list (vertices ))
273+ self .assertEqual (len (subgraph .vertices ), len (graph .vertices ))
274+ self .assertEqual (len (subgraph .edges ), len (graph .edges ))
275+
276+ def test_full_subgraph_from_iterator (self ):
277+ # Should be fine to create a subgraph from an iterator.
278+ vertex_count = 100
279+ vertices = set (range (vertex_count ))
280+ edge_mapper = {
281+ n : [(n + 1 ) % vertex_count , (n + 1 ) % vertex_count ]
282+ for n in vertices
283+ }
284+ graph = DirectedGraph .from_out_edges (
285+ vertices = vertices ,
286+ edge_mapper = edge_mapper ,
287+ )
288+ subgraph = graph .full_subgraph (iter (vertices ))
289+ self .assertEqual (len (subgraph .vertices ), len (graph .vertices ))
290+ self .assertEqual (len (subgraph .edges ), len (graph .edges ))
291+
260292 def test_to_dot (self ):
261293 dot = test_graph .to_dot ()
262294 self .assertIsInstance (dot , six .text_type )
0 commit comments