@@ -291,6 +291,38 @@ def test_full_subgraph(self):
291291 self .assertCountEqual (vertices , [1 , 2 , 3 , 4 , 5 ])
292292 self .assertEqual (len (edges ), 5 )
293293
294+ def test_full_subgraph_large_from_list (self ):
295+ # An earlier version of full_subgraph had quadratic-time behaviour.
296+ vertex_count = 20000
297+ vertices = set (range (vertex_count ))
298+ edge_mapper = {
299+ n : [(n + 1 ) % vertex_count , (n + 1 ) % vertex_count ]
300+ for n in vertices
301+ }
302+ graph = DirectedGraph .from_out_edges (
303+ vertices = vertices ,
304+ edge_mapper = edge_mapper ,
305+ )
306+ subgraph = graph .full_subgraph (list (vertices ))
307+ self .assertEqual (len (subgraph .vertices ), len (graph .vertices ))
308+ self .assertEqual (len (subgraph .edges ), len (graph .edges ))
309+
310+ def test_full_subgraph_from_iterator (self ):
311+ # Should be fine to create a subgraph from an iterator.
312+ vertex_count = 100
313+ vertices = set (range (vertex_count ))
314+ edge_mapper = {
315+ n : [(n + 1 ) % vertex_count , (n + 1 ) % vertex_count ]
316+ for n in vertices
317+ }
318+ graph = DirectedGraph .from_out_edges (
319+ vertices = vertices ,
320+ edge_mapper = edge_mapper ,
321+ )
322+ subgraph = graph .full_subgraph (iter (vertices ))
323+ self .assertEqual (len (subgraph .vertices ), len (graph .vertices ))
324+ self .assertEqual (len (subgraph .edges ), len (graph .edges ))
325+
294326 def test_to_dot (self ):
295327 dot = test_graph .to_dot ()
296328 self .assertIsInstance (dot , six .text_type )
0 commit comments