使用networkx模块,在Python 3.2下进行一些网络分析,需要将二分图(由囚犯与他们的牢房链接组成:在下面的代码中输入图B)投影到一个子图上(如果两个囚犯在同一牢房中有重叠的时间,则将它们联系起来:使用定义图B中囚犯节点的节点集作为输入,生成输出图G)。我不需要特殊算法来得出任何或最佳匹配,我只需要收集满足某些条件的所有链接。因此,我找到的其他SO帖子并不真正适用。但是:
随着我提供越来越多的数据,我的当前代码正在爆炸(RAM、swap和CPU方面)。请告诉我是否看到了优化下面5层循环的代码的方法。我不确定是否需要了解networkx的知识或我的边缘属性标签的详细信息。谢谢!
随着我提供越来越多的数据,我的当前代码正在爆炸(RAM、swap和CPU方面)。请告诉我是否看到了优化下面5层循环的代码的方法。我不确定是否需要了解networkx的知识或我的边缘属性标签的详细信息。谢谢!
def time_overlap_projected_graph_parallel(B, nodes):
G=nx.MultiGraph()
G.add_nodes_from((n,B.node[n]) for n in nodes)
for u in nodes:
unbrs = set(B[u])
nbrs2 = set((n for nbr in unbrs for n in B[nbr])) - set([u])
for v in nbrs2:
for mutual_cell in set(B[u]) & set(B[v]):
for uspell in B.get_edge_data(u,mutual_cell).values():
ustart = uspell[1]
uend = uspell[2]
for vspell in B.get_edge_data(v,mutual_cell).values():
vstart = vspell[1]
vend = vspell[2]
if uend > vstart and vend > ustart:
ostart = max(ustart,vstart)
oend = min(uend,vend)
olen = (oend-ostart+1)/86400
ocell = mutual_cell
if (v not in G[u] or ostart not in [ edict[1] for edict in G[u][v].values() ]):
G.add_edges_from([(u,v,{0: olen,1: ostart,2: oend,3: ocell})])
return G