检查是否有一些点在矩形内部,并且无论何时运行它都会使我的程序减慢很多。我们如何改变它以提高效率?
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)
答案 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范围内找到所有内容。