我目前正在开展一个项目,我需要找到一组大型网络图形对象的所有开放和封闭三元组。只是提出一个想法,我现在正在研究的是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个小时。我想我需要提高功能的效率,但我真的不知道该改变什么。 有人有什么建议吗?任何帮助将不胜感激!