Hi offonoffon...
  won't the creation of the vertices and edges one at a time end up
dramatically affecting the performance of graph creation (see my original
question at the top of the thread)?

I've found that creating the edges one at a time is MUCH slower than
creating them all at once and that creating the vertices one at a time is a
little slower.

What I have is not pretty though.

On 28 April 2015 at 01:11, ... <[email protected]> wrote:

> I solved this once by making a NoDupesGraph where you could add edges with
> just the names of vertices .
>
> class NoDupesGraph(Graph):
>     '''Add nodes without worrying if it is a duplicate.
>        Add edges without worrying if nodes exist   '''
>
>     def __init__(self,*args,**kwargs):
>         Graph.__init__(self,*args,**kwargs)
>         self._nodes = {}
>
>     def add_nodupe_vertex(self,label,*args,**kwargs):
>       '''Return a node with label. Create node if label is new'''
>       try:
>           n = self._nodes[label]
>       except KeyError:
>           n = self.add_vertex()
>           self._nodes[label]=n
>       return n
>
>     def add_nodupe_edge(self, n1_label, n2_label,directed=False):
>       """
>       Get or create edges using get_or_create_node
>       """
>       #there may be two if graph is directed but edge isn't
>       edges = []
>
>       n1 = self.add_nodupe_vertex(n1_label)
>       n2 = self.add_nodupe_vertex(n2_label)
>       edges.append(self.add_edge(n1,n2))
>       if self.is_directed() and not directed:
>           edges.append(self.add_edge(n2,n1))
>       return edges
>
>     def flush_empty_nodes(self):
>         '''not implemented'''
>         pass
>
>     def condense_edges(self):
>         '''if a node connects to only two edges, combine those
>         edges and delete the node.
>
>         not implemented
>         '''
>         pass
>
> This could be easily modified to suit your need.
>
> On Mon, Apr 27, 2015 at 3:23 PM, Krister <[email protected]> wrote:
>
>> Thanks for the quick response Thiago!
>>
>> In this code all the edges and vertices are created by graph-tool and the
>> result is something much faster...
>>    is this the best I can do?
>>
>> It's somewhat annoying to have to keep track of the vertices that will be
>> created like this:
>>
>> def graph_tool_create_all_at_once():
>>   """ Create a graph_tool graph given a list of pairs. """
>>   G = Graph(directed=False)
>>   objectTOi = {}
>>   vertexpairs = []
>>   counter = 0
>>   for o1,o2 in get_pairs_of_ints():
>>     if(o1 in objectTOi):
>>       u = objectTOi[o1]
>>     else:
>>       u = counter
>>       counter += 1
>>       objectTOi[o1] = u
>>     if(o2 in objectTOi):
>>       v = objectTOi[o2]
>>     else:
>>       v = counter
>>       counter += 1
>>       objectTOi[o2] = v
>>
>>     vertexpairs.append((u,v))
>>
>>   G.add_edge_list(vertexpairs)
>>
>>
>> On 27 April 2015 at 16:39, Tiago de Paula Peixoto <[email protected]>
>> wrote:
>>
>>> On 27.04.2015 14:29, thekswenson wrote:
>>> > I've been using networkx to simply create a graph and check the
>>> connected
>>> > components.  The bottleneck of the operation is the creation of the
>>> edges.
>>> >
>>> > I've heard that graph-tool is very efficient so I've replaces the code
>>> with
>>> > a graph-tool graph.
>>> > To my surprise, the creation of a graph-tool graph is MUCH slower than
>>> that
>>> > of a networkx graph.
>>> >
>>> > Am I doing something wrong?
>>>
>>> How does the performance change if you create the necessary edges
>>> beforehand?
>>>
>>> In graph-tool things are faster than in networkx when they are delegated
>>> to C++, otherwise this should be comparable in speed. In the case of
>>> adding many edges, this is done by using the Graph.add_edge_list()
>>> function, which runs in C++ internally. In your example, this should
>>> provide a massive speed-up.
>>>
>>> Best,
>>> Tiago
>>>
>>> --
>>> Tiago de Paula Peixoto <[email protected]>
>>>
>>>
>>> _______________________________________________
>>> graph-tool mailing list
>>> [email protected]
>>> http://lists.skewed.de/mailman/listinfo/graph-tool
>>>
>>>
>>
>> _______________________________________________
>> graph-tool mailing list
>> [email protected]
>> http://lists.skewed.de/mailman/listinfo/graph-tool
>>
>>
>
> _______________________________________________
> graph-tool mailing list
> [email protected]
> http://lists.skewed.de/mailman/listinfo/graph-tool
>
>
_______________________________________________
graph-tool mailing list
[email protected]
http://lists.skewed.de/mailman/listinfo/graph-tool

Reply via email to