Используя модуль 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
for mutual_cell in B[u]
, а затемfor v in B[mutual_cell]
. Тогда, конечно, вы должны пропустить, если v == u. - person Avaris   schedule 20.09.2011G.add_nodes_from(...)
, поскольку в ней тоже есть цикл, либо остальная часть вашего кода, которая занимает много времени. Вы делали профилирование? - person steabert   schedule 20.09.2011