我有一个包含数百万个字符串的txt,每个都与此格式类似:
#2851= TITLE('object','attribute',#2847,#2848,#2849,#2850);
我使用networkx映射它的方向图,以获取所有节点和边缘,使用:
def Digraph_path(txt):
G=nx.DiGraph()
for l in txt:
res = re.findall("#\d{3,10}",l)
for num in res[1:]:
G.add_edge(res[0],num)
return G
由于txt中的行数,下面的过程需要很多时间。我想让它更有效率。对该过程的一个有用的解释是,首先我有obj
个项目,每个项目都有一个与之相关的“父母”列表,因此我首先使用predecessors
,然后扩展我们的object_num_sets
txt中信息结构的性质要求我们这样做。
在此之后,我找到了孩子和孙子等等,直到层次结构,
GENA - > GENB - > GENC - > GEND - &GT基因 - > genF
每次使用这些数字扩展我的数组,所以最后数组中的每个obj
项都在一个嵌套列表中,其中包含来自txt的所有“系列”。
for obj in matrix:
idx = matrix.index(obj)
for num in obj:
object_num_sets[idx].append(num)
genA = list( Digraph.predecessors(num) )
object_num_sets[idx].extend(genA)
for child in genA:
genB = list( Digraph.successors(child) ) #we find further children
#our initial obj number has parents, and they have children among
#which is also obj itself, so obj has "cousins", but we do not want to
#repeat obj twice in the same list so we find it and remove it:
for obj in matrix:
if obj[0] in genB:
genB.remove(obj[0]) #remove duplicate #'s
object_num_sets[idx].extend(genB)
for childB in genB:
genC = list( Digraph.successors(childB) )
object_num_sets[idx].extend(genC)
for childC in genC:
gen = list( Digraph.successors(childC) )
object_num_sets[idx].extend(bnei_ninim)
for childD in genD:
genE = list( Digraph.successors(childD) )
object_num_sets[idx].extend(genE)
for childE in genE:
genF = list( Digraph.successors(childE) )
object_num_sets[idx].extend(genF)
问题是:
networkx
,因为我们不想重复任何数字,但我们也不想只使用successors
,因为我们有一个我们想要的实例找到'堂兄',因此我们首先使用predecessors
...所以这不是一个简单的问题'树下的每个分支'yield
代替return
来更快地完成流程?