Hi Alexandre and thanks for your useful response
The *add_edge_list* internally changes edges ordering to the lexicographic
one so in order to set weights, I have to sort the weighted-edge list,
adding some little overhead. On the other hand, *add_edge_list()* is much
more efficient than adding edges one by one with the add_edge method (about
7 times faster!). Unfortunately, this is still slow, even slower than
NetworkX (about 1.2 times slower and we all know that NetworkX highest
quality is not speed).
Here is the new version:
# ***********************
from time import clock
from sys import stderr, stdin
import graph_tool as gt
from graph_tool.topology import min_spanning_tree
import networkx as nx
# ------------ NetworkX Code ---------------------------
def kruskal_networkX(edges, n):
G=nx.Graph()
for a, b, w in edges:
G.add_edge(a,b,weight=w)
return sum(d['weight'] for (_,_,d) in
nx.minimum_spanning_tree(G).edges(data=True))
# ------------ Graph_tool Code ---------------------------
def kruskal_gt(wedges,n):
wedges.sort()
g= gt.Graph(directed=False)
edges, weights= zip(*[((a,b),w) for (a,b,w) in wedges])
weight = g.new_edge_property("long long")
g.add_edge_list(edges)
for e,(_,_,w) in zip(g.edges(), wedges):
weight[e]=w
tree=min_spanning_tree(g, weights=weight)
return sum(b*weight[e] for (e,b) in zip(g.edges(), tree))
# ------------ Benchmark ---------------------------
def go(solver, L):
global duration
N=len(L)
k=1
while k<N:
edges=[]
n=L[k]
k+=1
for a in range(n):
d=L[k]
k+=1
for j in range(d):
b=L[k]
k+=1
w=L[k]
k+=1
if a<b:
edges.append([a,b-1,w])
start=clock()
print(solver(edges, n))
duration+=clock()-start
# data
L=list(int(z) for z in stdin.read().split() if z.isdigit())
for solver in [kruskal_networkX, kruskal_gt]:
duration=0
go(solver, L)
print("----------------------------")
print("%s : %.3f" %(solver.__name__, duration), file=stderr)
# ***********************
$ python3 gt_v2.py < big.in > gt.out
kruskal_networkX : 15.851
kruskal_gt : 19.713
--
Sent from:
http://main-discussion-list-for-the-graph-tool-project.982480.n3.nabble.com/
_______________________________________________
graph-tool mailing list
[email protected]
https://lists.skewed.de/mailman/listinfo/graph-tool