Python 平面间角度算法太慢

Python 平面间角度算法太慢,python,algorithm,python-3.x,graph-theory,Python,Algorithm,Python 3.x,Graph Theory,我已经编写了计算相邻平面之间角度的工作代码 以下是我已经尝试优化的内容: 我去掉了几个np内置函数,例如np.cross和np.linalg.norm,这给了我几秒钟的时间 对于范围为1,n的z,为了不考虑已经计算的三角形,我将1改为k 我也试着更快地输入,但没有用 请问,有人能告诉我如何使它明显更快吗? 我不太熟悉图表,对此我有一种不好的感觉 迁移到Code Review可以通过将所有三角形相互匹配来确定三角形的邻接关系。如果创建边字典,可以更有效地查找相邻三角形 使用边的两个节点作为关键点。

我已经编写了计算相邻平面之间角度的工作代码

以下是我已经尝试优化的内容:

我去掉了几个np内置函数,例如np.cross和np.linalg.norm,这给了我几秒钟的时间

对于范围为1,n的z,为了不考虑已经计算的三角形,我将1改为k

我也试着更快地输入,但没有用

请问,有人能告诉我如何使它明显更快吗? 我不太熟悉图表,对此我有一种不好的感觉


迁移到Code Review

可以通过将所有三角形相互匹配来确定三角形的邻接关系。如果创建边字典,可以更有效地查找相邻三角形

使用边的两个节点作为关键点。为了使键唯一,将索引最低的节点设为第一个节点。您可以在读取索引时创建dict:

edge = {}

for i in range(n):
    a, b, c = [int(j) for j in raw_input().split()]
    ind.append((a, b, c))

    k = (min(a, b), max(a, b))
    edge[k] = edge.get(k, []) + [i]

    k = (min(b, c), max(b, c))
    edge[k] = edge.get(k, []) + [i]

    k = (min(c, a), max(c, a))
    edge[k] = edge.get(k, []) + [i]
用这样的格言:

def calculate_angle():
    for e in edge:
        if len(e) == 2:
            i1, i2 = e
            n1 = norm[i1]
            n2 = norm[i2]

            a = abs(math.acos(max(-1, min(1, dot(n1, n2)))))
            angles_list.append(a)

    return max(angles_list)
这里的缺点是,角度在列表中以任意顺序出现,但在原始代码中也是如此

通过仅一次将法线预计算为每个tria的单位向量,并将其存储在列表范数中,可以加快程序的速度。这就是我在上面所做的。然后,角度计算仅为点积的弧余弦


你只需要最大值吗?然后,不要创建列表,而是保留一个运行的最大值,如果当前角度大于当前最大值,则更新该值。

如果代码完整且有效,但只需要改进,则应该真正进行代码检查。此站点主要用于修复损坏的代码。@Carcigenicate,谢谢,我将在那里添加它。@M Oehm,非常感谢您提供详细的答案。但我仍然有几个问题:i1,i2=e-这里我们得到2个任意值?我预先计算法线:norm=[]def normalstrianges:对于三角形中的t:a=angle\u normt norm.appendunit\u vectora返回norm,但get indexer:list index超出了n1=norm[i1]行的范围,不知道为什么。@M Oehm,还有最后一个问题:当我打印边时,我得到:{0,1:[0],1,2:[0,1],1,3:[1],2,3:[1],0,2:[0]}我真的不明白为什么这些键值对看起来像这样。这到底是什么意思?例如,键1,2的值为[0,1]。预计算法线的方式看起来不错,但由于修改了全局列表,因此无需返回该列表。你怎么称呼法线?边的关键值是元组。通常使用字符串或整数作为dict键,但Python允许任何可散列类型。边[1,2]==[0,1]表示节点1和2之间的dge属于两个三角形0和1。节点0和1之间的边只附着了一个三角形0。这是一个边界。@M Oehm,了解键值对,谢谢:我试图修复这个错误,现在它不喜欢我通过索引调用int。我把法线称为calculate_angle:两件事:预先计算法线意味着只计算一次并存储它们,这样就不必在每次需要时都进行可能代价高昂的计算。在调用计算_角度之前,将调用移动到法线。在法线中,使用整数调用angle_normi,其中需要节点列表。在ind:此处用于i,而不是在range:中用于i。