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
