From 7db79ae57a3c119c382c0be375b79c3ce687a93d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 15 Mar 2016 10:41:36 +1100 Subject: PyAPI: Double performance of Mesh.from_pydata D1853 by @JacquesLucke The speedup is mainly possible by using the `foreach_set` method for polygon data. --- release/scripts/modules/bpy_types.py | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) (limited to 'release') diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py index d0607cbe675..c1a37d10961 100644 --- a/release/scripts/modules/bpy_types.py +++ b/release/scripts/modules/bpy_types.py @@ -409,28 +409,24 @@ class Mesh(bpy_types.ID): :type faces: iterable object """ + from itertools import chain, islice, accumulate + + face_lengths = tuple(map(len, faces)) + self.vertices.add(len(vertices)) self.edges.add(len(edges)) - self.loops.add(sum((len(f) for f in faces))) + self.loops.add(sum(face_lengths)) self.polygons.add(len(faces)) - vertices_flat = [f for v in vertices for f in v] - self.vertices.foreach_set("co", vertices_flat) - del vertices_flat - - edges_flat = [i for e in edges for i in e] - self.edges.foreach_set("vertices", edges_flat) - del edges_flat - - # this is different in bmesh - loop_index = 0 - for i, p in enumerate(self.polygons): - f = faces[i] - loop_len = len(f) - p.loop_start = loop_index - p.loop_total = loop_len - p.vertices = f - loop_index += loop_len + self.vertices.foreach_set("co", tuple(chain.from_iterable(vertices))) + self.edges.foreach_set("vertices", tuple(chain.from_iterable(edges))) + + vertex_indices = tuple(chain.from_iterable(faces)) + loop_starts = tuple(islice(chain([0], accumulate(face_lengths)), len(faces))) + + self.polygons.foreach_set("loop_total", face_lengths) + self.polygons.foreach_set("loop_start", loop_starts) + self.polygons.foreach_set("vertices", vertex_indices) # if no edges - calculate them if faces and (not edges): -- cgit v1.2.3