我怎样才能加快这个功能?

时间:2013-02-05 18:13:25

标签: python pygame

检查是否有一些点在矩形内部,并且无论何时运行它都会使我的程序减慢很多。我们如何改变它以提高效率?

def draw_grid(self, box):
    for element in self.map_layout.all_map_objects:
        if element not in self.build_grid and box.area.collidepoint(element.checkpoint):
            self.build_grid.append(element)
        elif not box.area.collidepoint(element.checkpoint):
            if element in self.build_grid:
                self.build_grid.remove(element)

3 个答案:

答案 0 :(得分:3)

一个微不足道的变化是存储box.area.collidepoint

的结果
def draw_grid(self, box):
    for element in self.map_layout.all_map_objects:
        collidepoint = box.area.collidepoint(element.checkpoint)
        if element not in self.build_grid and collidepoint:
            self.build_grid.append(element)
        elif not collidepoint:
            if element in self.build_grid:
                self.build_grid.remove(element)

其他更改依赖于您需要的数据结构。例如,self.build_grid似乎是list。列表上的__contains__(在运算符中)平均是O(N)操作,而如果您可以使用set它将是O( 1)!即可。同样的事情与list.remove一致 - 在这里你可以使用try-except子句从紧密循环中删除一个O(N)操作,如果元素通常是,这可能会有所帮助在列表中:

        elif not collidepoint:
            try:
                self.build_grid.remove(element)
            except ValueError:
                pass

答案 1 :(得分:1)

只有在移动元素时才能检查碰撞等,而不是在绘图时检查?

此外,您可能两次调用box.area.collidepoint(element.checkpoint):element in self.build_grid:,一次调用if,另一次调用elseif。如果它的计算成本很高,你可以缓存这个答案吗?

答案 2 :(得分:1)

如果将这些点保留在某些排序数据结构中,则无需检查每一个。按Y排序,在矩形的Y范围内找到所有内容,然后按X对新列表进行排序,并在矩形的X范围内找到所有内容。