使用Networkx在大型Graph中查找开放和已关闭的三元组

时间:2016-10-21 06:54:20

标签: graph networkx

我目前正在开展一个项目,我需要找到一组大型网络图形对象的所有开放和封闭三元组。只是提出一个想法,我现在正在研究的是178593节点和268831。

现在为了找到开放和封闭的三合会,我写了以下函数

def find_tri(G):

closed_T=[]
open_T=[]
for i in G.nodes():
    a = tuple([i] + G.neighbors(i)) #list concat
    if len(a) == 3:
        if len(G.subgraph([i] + G.neighbors(i)).edges()) == 3:
            if tuple(sorted(a)) not in closed_T: 
                closed_T.append(tuple(sorted(a)))
        else:
            sorted_triad=sorted(nx.degree(G.subgraph([i] + G.neighbors(i))), key=nx.degree(G.subgraph([i] + G.neighbors(i))).get)
            open_T.append(tuple(sorted_triad))
    elif len(a) > 3:
        #triad_neig=  filter(lambda t: i in t, list(itertools.combinations(G.subgraph([i] + G.neighbors(i)).nodes(),3)))
        triad_neig=list(itertools.combinations(G.subgraph([i] + G.neighbors(i)).nodes(),3))
        triad_neig = [x for x in triad_neig if i in x]            
        for k in triad_neig:

            if len(G.subgraph(k).edges()) == 3:
                if tuple(sorted(k)) not in closed_T:
                    closed_T.append(k)

            elif len(G.subgraph(k).edges()) == 2:
                if k not in open_T:
                    sorted_triad=sorted(nx.degree(G.subgraph(k)), key=nx.degree(G.subgraph(k)).get)
                    open_T.append(tuple(sorted_triad))

return open_T, closed_T

然后将该函数应用于nx.Graph(),它对小图非常有效。但对于我上面描述的那个,目前运行超过15个小时。我想我需要提高功能的效率,但我真的不知道该改变什么。 有人有什么建议吗?任何帮助将不胜感激!

0 个答案:

没有答案