最近邻算法的优化

时间:2013-11-16 14:34:22

标签: python algorithm python-2.7 optimization

背景
前段时间我问了一个问题here,关于通过比较每个点与其他点之间找到一组数据中每个点的邻居的最有效方法。我试图通过将坐标列表基于其x坐标分成不同的集合并将它们分组为重叠集来优化过程。然后在每个集合上使用邻居查找器'pairs_3'。然后,这给了我顶点之间的全套连接。下面的代码是我目前所拥有的代码片段:

def pairs_3(coordinates, vertex_spacing): #Function from previous question
    i=-1
    results_2 = []
    results_2 [:]= []
    for (xc, yc, zc) in enumerate(coordinates):
        for (xb, yb, zb) in enumerate(coordinates[ic:]):
            dx = xb - xc 
            if sqrt(dx**2) > a:
                    break
            dy = yb - yc
            dz = zb - zc

            if (sqrt(dx**2+dy**2+dz**2)) == vertex_spacing:
                i+=1
                results_2.append([(xc, yc, zc), (xb, yb, zb), width, dx, dy, dz, edge])
    return results_2

Coordinates_xyz=sorted(set(zip(Coord_x,Coord_y,Coord_z))) #Full 3D coordinate list
Coord_x_set=sorted(set(Coord_x))
numerical_width = Coord_x.count(Coord_x_set[1]) #gets number of columns
N=numerical_width
Col_subList = [Coordinates_xyz[n:n+2*N] for n in range(0,         len(Coordinates_xyz), N)] #Col_subList is a list of grouped data according to x coordinate. The data is always discrete, so this is possible.

new_p_2=[]
new_p_2[:]=[]
new_p_3=[]
new_p_3[:]=[]
#where a is vertex separation, a known value used to generate the data
for x in Col_subList:
   new_p_2.append(pairs_3(x, a))

for x in new_p_2:
    for y in x:
        new_p_3.append(y)

p_2=new_p_3
start=column(p_2,0) #Start Vertex
end=column(p_2, 1) #End Vertex
s_i=[] #Start Vertex Index
s_i[:]=[] 
c_i=[] #Connection Index
c_i[:]=[]
for i in start:
indices = [ind for ind, x in enumerate(Coordinates_xyz_final) if x == i]
for j in indices:
    s_i.append(j)

for i in xrange(len(start)):
c_i.append(i)
p_2 = zip(start, end, s_i, c_i) #Final form necessary for later calculations

问题:
有没有办法进一步/更好地优化此代码?有没有什么方法可以进一步解决问题,而这个问题的计算成本并不比函数本身高?

奖金问题:
有没有办法有效地将“分而治之”整合到函数本身中?即根据函数内的列将列表分成几组?

2 个答案:

答案 0 :(得分:1)

您要找的是R-Tree。如果您只是希望它作为解决问题的工具,我建议您选择其中一个现有的实施方案,Google就会出现问题。 https://pypi.python.org/pypi/Rtree/

答案 1 :(得分:0)

有两种方法没有优化算法:

  1. 如果您的脚本包含嵌套for循环或while循环

  2. ,请使用 pypy
  3. 在这种情况下,algo很简单,包含很多for循环,包含很多算术运算,然后用C语言编写它是个好主意。最简单的方法是使用SWIG

  4. 你也可以使用scipy / numpy进行数学运算。