【发布时间】:2011-11-21 02:49:02
【问题描述】:
使用 networkx 模块,我在 Python 3.2 下进行了一些网络分析,其中我需要将二分图(链接到其牢房的囚犯:在下面的代码中输入图 B)投影到子图(将狱友相互链接如果两者在同一个单元格中有重叠的咒语:使用定义图 B 的同居节点的集合节点的输入,生成输出图 G)。我不需要特殊的算法来提出任何或最佳匹配,我只需要收集满足某些条件的所有链接。因此,我发现的其他 SO 帖子并不真正适用。但是:
随着我提供越来越多的数据,我当前的代码正在崩溃(RAM、交换和 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
【问题讨论】:
-
你能澄清更多吗?我猜B是原始图,那么什么是节点?而且我不确定我是否理解你想要什么。你有一个牢房和囚犯的二分图。那你想要一张什么图?只是犯人?如果它们在同一个单元格中,则连接?
-
谢谢,Avaris,您理解正确,但我也会澄清我的问题。
-
好的。术语“子图”让我震惊,因为从技术上讲,新图不会是子图。在这种情况下,为什么不直接遍历单元格并在新图中连接单元格的邻居?
-
循环在 python 中效率不高 (wiki.python.org/moin/PythonSpeed/PerformanceTips#Loops)。如果您的 2 个内部循环变大,它可能确实会变得非常慢。你循环的东西的典型尺寸是多少?
-
试图从代码中理解(如果我错了,请纠正我):节点 = 囚犯,u = 第一个囚犯,unbrs = 你所在的牢房,nbrs2 = 留在 unbrs 的所有囚犯,v = 另一个囚犯,mutual_cell = 他们共享的牢房。
标签: python performance loops python-3.x networkx