0

これは、いくつかの点が長方形の内側にあるかどうかをチェックし、実行されるたびにプログラムの速度が大幅に低下します。より効率的にするためにどのように変更できますか?

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)
4

3 に答える 3

3

簡単な変更の 1 つは、次の結果を格納することです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__(in operator) リストに対する操作は、平均して O(N) 操作setですが、を使用できれば O(1) になります。. 同じことが言えlist.removeます-ここでは、句を使用して、要素が通常リストにあるtry-except場合に役立つタイトループから1つのO(N)操作を削除できます。

        elif not collidepoint:
            try:
                self.build_grid.remove(element)
            except ValueError:
                pass
于 2013-02-05T18:17:32.570 に答える
1

これらのポイントをソートされたデータ構造に保持すると、すべてをチェックする必要がなくなります。Y で並べ替え、長方形の Y 範囲内のすべてを見つけてから、その新しいリストを X で並べ替え、長方形の X 範囲内のすべてを見つけます。

于 2013-02-05T18:24:24.737 に答える
1

描画中ではなく、要素が移動したときだけ衝突などをチェックできますか?

また、 if に対して 1 回、elseif に対して 2 回、場合によっては 2 回box.area.collidepoint(element.checkpoint):呼び出しています。element in self.build_grid:計算コストが高い場合、その回答をキャッシュできますか?

于 2013-02-05T18:16:46.847 に答える