1

所以我目前有一个定义游戏地图的对象的二维列表,其中每个对象代表该地图上的一个图块。当我将代码重新用于其他用途时,我想知道使用字典来存储地图数据或继续使用列表是否更有意义。对于列表,索引表示映射的 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

I would be wary of premature optimization.

Does your current approach have unacceptable performance? Does the data structure you're using make it harder to reason about or write your code?

If there isn't a specific problem you need to solve that can't be addressed with your current architecture, I would be wary about changing it.

于 2013-01-24T20:43:26.103 回答
0

我不确定你会得到“正确”的答案,但是当我在 Python 中创建 *Game of Life * 时,我使用了dict. 实际上,多维列表的查找成本和 a 中的查找成本之间应该没有实质性差异dict(两者都是 O(1)),但是如果您使用的是 adict那么您无需担心实例化整个游戏板。在国际象棋中,这意味着您只创建 32 个棋子,而不是 64 个方格和 32 个棋子。另一方面,在围棋游戏中,您只能创建 1 个对象,而不是 361 个列表单元。

也就是说,在 dict 的情况下,您将需要实例化tuples。如果您可以缓存这些(或仅迭代dict's 键),那么也许您将获得世界上最好的。

于 2013-01-24T20:50:33.753 回答
0

这是参考有关 python 列表与字典的速度和内存使用情况的一个很好的答案:https ://stackoverflow.com/a/513906/1506904

在您获得一个非常大的数据集之前,如果您当前的方法对您很有效,那么它很可能非常适合您。

于 2013-01-24T20:46:13.280 回答