これが最速のオプションであるかどうかはわかりませんが、おそらくそうではありませんが、機能します。edges.index((v, polygon[i + 1]))最も遅い部分は、このエッジが既にリストにあるかどうかを確認する必要がある部分だと思います。エッジは頂点インデックスのペアであるため、頂点配列は実際には必要ありません。面が何であるかを書いていないので、ポリゴン インデックスへの参照として face_index を使用しました。
vertex = [[0,0,0], [0,0,1], [0,1,0],[1,0,0],[0.5,0.5,0.5]]
polygons = [3,0,1,2,4,1,2,3,4]
_polygons = polygons
edges = []
faces = []
face_index = 0
while _polygons:
polygon = _polygons[1:_polygons[0] + 1]
polygon.append(polygon[0])
_polygons = _polygons[_polygons[0] + 1:]
for i, v in enumerate(polygon[0:-1]):
if not (v, polygon[i + 1]) in edges:
edges.append((v, polygon[i + 1]))
faces.append([face_index, ])
else:
faces[edges.index((v, polygon[i + 1]))].append(face_index)
face_index += 1
edges = map(lambda edge, face: (edge, face), edges, faces)
print edges
<<< [((0, 1), [0]), ((1, 2), [0, 1]), ((2, 0), [0]), ((2, 3), [1]), ((3, 4), [1]), ((4, 1), [1])]
polygon.append(polygon[0])ラインを削除し、ポリゴンの最初の頂点をポリゴンの頂点リストに手動で追加することで高速化できますが、これは問題にはなりません。つまり、に変更polygons = [3,0,1,2,4,1,2,3,4]しpolygons = [3,0,1,2,0,4,1,2,3,4,1]ます。
PS PEP8を使用してみてください。コードタイピングスタイルです。読みやすくするために、イテラブルの各コンマの後にスペースを入れる必要があると書かれています。