如何通过这个转换后的numpy数组加速迭代?

时间:2013-02-10 04:11:08

标签: python performance numpy nested-loops

下面是使用pyglet渲染的2D等距图块地图的部分类定义。

class Map(object):

    origin = 0
    drytile = tile.dry
    wettile = tile.wet

    def __init__(self, left=8, right=8):
        self.grid = np.array(([None] * left, [None] * right), dtype=object)
        self._setup_grid()

    def __iter__(self):
        """return tiles in the order in which they should be rendered"""
        # get number of diagonals
        ndiags = (np.max(self.grid.shape) * 2) -\
                 (1 + (np.max(self.grid.shape) - np.min(self.grid.shape)))

        # get iterator to go through diagonals in back-to-front order
        offsets = xrange(-(ndiags / 2), ndiags / 2 + 1)

        # iterate in render order
        for off in offsets:
            for tile in np.flipud(self.grid).diagonal(off)[::-1]:
                yield tile

这些图块需要从前到后呈现,如下图所示:

Tile render order.  Origin is at the top corner

在我的班级定义中,原点指的是最顶部的图块(图块a),因此类中定义的left维度是[a b d g]和{{{{{{ 1}}维度是right的向量。

这是我的应用程序的速度关键部分,因为我打算渲染大量的tile。是否有更快的方式以指定的顺序迭代切片?可能会消除嵌套循环的帮助吗?

非常感谢!

1 个答案:

答案 0 :(得分:0)

我会首先订购数据结构。如果你订购了矢量,那么迭代会更快。

一般来说,使用有序数据结构对于这类事情是有益的。

如果您出于某种原因操纵结构,则需要执行“有序插入”或删除,这样会更慢。使用有序数据结构的权衡取决于插入和移除,并且由于板不应该改变很多,所以看起来你只能使用有序的数据结构。