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, ... <offonoffoffonoff@gmail.com> wrote:

I solved this once by making a NoDupesGraph where you could add edges with just the names of vertices .This could be easily modified to suit your need.

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

'''

passOn Mon, Apr 27, 2015 at 3:23 PM, Krister <thekswenson@gmail.com> wrote:is this the best I can do?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...

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 <tiago@skewed.de> 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 <tiago@skewed.de>

graph-tool mailing list

graph-tool@skewed.de

http://lists.skewed.de/mailman/listinfo/graph-tool

_______________________________________________

graph-tool mailing list

graph-tool@skewed.de

http://lists.skewed.de/mailman/listinfo/graph-tool

_______________________________________________

graph-tool mailing list

graph-tool@skewed.de

http://lists.skewed.de/mailman/listinfo/graph-tool