1

そのため、現在、ゲームのマップを定義するオブジェクトの2Dリストがあり、各オブジェクトはそのマップ上のタイルを表しています。コードを別の目的に転用しているときに、辞書を使用して地図データを保存する方が理にかなっているのか、それともリストを使い続けるのが理にかなっているのか疑問に思いました。リストでは、インデックスはマップのxとyを表しますが、辞書では、(x、y)タプルが辞書のキーになります。

私が尋ねる理由は、マップの変更はまれなイベントであるため、データはかなり静的であり、私が知る限り、辞書ではかなり一定のルックアップが高速になるためです。また、マップを描画するためのループを単純化する必要があります。ほとんどの場合、辞書を使用するとデータへのアクセスが簡単になると思いますが、すべての場合に当てはまるかどうかはわかりません。

これらの利点は、辞書が占めると私が想定する追加のメモリの価値がありますか?または私は利益が利益であるということについてさえ正しいですか?

編集 私は現在の方法が機能することを知っています、それはよりきれいに見えるコードを持ちそして潜在的な欠点を見つけるために切り替えることが理にかなっているかどうかにもっと関係がありました。配列をループするようなものは、次のようなものから始まります

for i in range(size[0]):
    for e in range(size[1]):
        thing.blit(....using i and e)

for i, e in dict.items():
    i.blit(....using i and e)

またはdictアイテムを検索すると

def get(x, y):
    if (x in range(size[0])) and (y in range(size[1])):
        return self.map[x][y].tile

def get(item):
    return self.dict.get(item)

それほど多くはありませんが、ややクリーンです。遅くなく、他に欠点がない場合は、そうしない理由はありません。

4

3 に答える 3

2

私は時期尚早の最適化に警戒するでしょう。

あなたの現在のアプローチは許容できないパフォーマンスを持っていますか?使用しているデータ構造により、コードの推論や記述が難しくなっていますか?

現在のアーキテクチャでは対処できない、解決する必要のある特定の問題がない場合は、変更することに注意します。

于 2013-01-24T20:43:26.103 に答える
0

これに対して「正しい」答えが得られるかどうかはわかりませんが、Pythonで*人生ゲーム*を作成したときは、を使用しましたdict。現実的には、多次元リストのルックアップコストとdict(両方ともO(1))のルックアップコストの間に実質的な違いはないはずですが、を使用している場合は、dictインスタンス化について心配する必要はありません。ゲームボード全体。チェスでは、これは、64個の正方形と32個のピース​​ではなく、32個のピース​​のみを作成していることを意味します。一方、囲碁のゲームでは、361個のリストセルではなく1つのオブジェクトしか作成できません。

とはいえ、dictの場合は、tuplesをインスタンス化する必要があります。それらをキャッシュできる(またはdictのキーのみを繰り返す)ことができれば、おそらくすべての世界で最高のものを手に入れることができます。

于 2013-01-24T20:50:33.753 に答える
0

これは、Pythonリストと辞書の速度とメモリ使用量について参照するための良い答えです:https ://stackoverflow.com/a/513906/1506904

信じられないほど大きなデータセットに到達するまでは、現在の方法がうまく機能していれば、完全に適している可能性があります。

于 2013-01-24T20:46:13.280 に答える