用于存储游戏地图的列表或词典

时间:2013-01-24 20:40:14

标签: python list dictionary

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

它不多,但它有点清洁,如果它没有任何慢,没有其他缺点,我认为没有理由不。

3 个答案:

答案 0 :(得分:2)

我会对过早优化保持警惕。

您当前的方法是否具有令人无法接受的性能?您使用的数据结构是否会使您更难推理或编写代码?

如果没有您需要解决的特定问题无法通过当前架构解决,我会对更改它感到谨慎。

答案 1 :(得分:0)

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

在你获得一个非常大的数据集之前,你的当前方法很可能是适合你的。

答案 2 :(得分:0)

我不确定你会得到“正确”的答案,但是当我在Python中创建*生命游戏*时,我使用了dict。实际上,多维列表的查找成本与dict中的查找成本(两者都是O(1))之间不应存在实质性差异,但如果您使用dict则你不必担心实例化整个游戏板。在国际象棋中,这意味着你只创造了32个而不是64个方块和32个。另一方面,在 Go 的游戏中,您只能创建1个对象而不是361个列表单元格。

那就是说,在dict的情况下,你需要实例化tuple s。如果你可以缓存那些(或只迭代dict的密钥)那么你可能会获得最好的世界。