python中嵌入式循环的多线程

时间:2012-11-13 02:48:34

标签: python multithreading loops for-loop parallel-processing

我有一个python代码,可以对Shapefile中包含的数据进行一些操作。

在其他内容中,代码执行此操作:

 xxx=0
 for i in channels:
      ptsi=mat(shapes[i].points)
      xx = ptsi[:,0]
      yy = ptsi[:,1]

      nanx=argwhere(isnan(xx))      
      nany=argwhere(isnan(yy))

      if (nanx == nany and len(nanx) != 0):
          xx[nanx] = []
          yy[nany] = []
      elif (len(nanx) != 0 or len(nany) != 0):
          xx = []
          yy = []

      if (len(xx) > 0):          
       yyy = 0 
       dd = str(i*100/N_channels) + '%\r\r'
      # os.write(1,dd)
       dist = zeros(len(xx)-1)

       dist = dist_min
       for j in channels:
           pts=mat(shapes[j].points)
           xx2 = pts[:,0]
           yy2 = pts[:,1]

           nanx=argwhere(isnan(xx2))          
           nany=argwhere(isnan(yy2))

           if (nanx == nany and len(nanx) != 0):
            xx2[nanx] = []
            yy2[nany] = []
           elif (len(nanx) != 0 or len(nany) != 0):
            xx2 = []
            yy2 = []
           if (len(xx2) > 0):  
            if (i != j): 
               ds = gaa(xx,yy,xx2[0],yy2[0])
               de = gaa(xx,yy,xx2[-1],yy2[-1])
               nande = ~isnan(de)
               nands = ~isnan(ds)
               fe = np.argwhere(de<=dist)
               fs = np.argwhere(ds<=dist)
               nozeroe = array(where(de != 0))
               nozeroe = nozeroe[0]
               nozeros = array(where(ds != 0))
               nozeros = nozeros[0] 
               if(fs.size >0):
                    iis=array(np.argwhere(array(ds==min(ds))))

                    iis = iis.flatten()
                    iis = iis[0]
                    p1 = xxx + iis 
                    p2 = yyy
                    G.add_edge(p2,p1,weight=w_con)

               elif (fe.size > 0):
                    iie=array(np.argwhere(array(de==min(de))))
                    iie = iie.flatten()
                    iie = iie[0]
                    p1 = xxx + iie
                    p2 = yyy  + len(pts) -1
                    G.add_edge(p2,p1,weight=w_con)

           yyy = yyy + len(pts)

      xxx = xxx + len(ptsi)

基本上,代码扫描折线并搜索最小距离,然后在公共图中合并(使用Networkx)。这部分工作正常,但是当我处理超过100个对象的时候这很慢(在当前版本中大约需要20个小时)。

这些嵌入式循环效率不高,所以我想知道,如果使用多线程可能会有所帮助,如果是这样,我该如何修改这部分代码呢?如果能有所帮助,我对CUDA或OpenCL很好。

感谢您的反馈!

2 个答案:

答案 0 :(得分:1)

由于Global Interpreter Lock,Python代码无法通过多线程充分利用多个内核,需要使用多处理才能充分利用多个内核。

答案 1 :(得分:0)

更多线程无济于事;更多的进程可能,但如果你可以使用CUDA,这可能是一个很好的举措。线程只是允许多个事物共享进程CPU时间的一种方式,它不会加速慢速代码,但只会减慢你的速度。