Используя модуль networkx, я делаю некоторый сетевой анализ в Python 3.2, где мне нужно спроецировать двудольный граф (заключенных, связанных с их ячейкой: входной граф B в коде ниже) на подграф (связывающий сокамерников друг с другом если оба имеют заклинание с перекрытием в одной и той же ячейке: использование входных данных множества узлов, определяющих узлы-заключенные графа B, генерирует выходной граф G). Мне не нужен специальный алгоритм, чтобы найти какое-либо или оптимальное соответствие, мне просто нужно собрать все ссылки, которые удовлетворяют некоторым условиям. Таким образом, другие SO сообщения, которые я нашел, на самом деле не применяются. Но:
Мой текущий код взрывается (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