python networkx有两百万字符串的digraph效率

时间:2018-05-11 13:56:19

标签: python string networkx hierarchy nested-lists

我有一个包含数百万个字符串的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)

问题是:

  1. 我们如何更有效地使用networkx,因为我们不想重复任何数字,但我们也不想只使用successors,因为我们有一个我们想要的实例找到'堂兄',因此我们首先使用predecessors ...所以这不是一个简单的问题'树下的每个分支'
  2. 我们能否以某种方式使用yield代替return来更快地完成流程?
  3. 在这里使用列表与生成器有什么区别?从我可以看出,生成器不会做完全相同的事情,因为在每个循环之后它们部分或完全停止存在,具体取决于嵌套的循环级别......?

0 个答案:

没有答案