所以我目前有一个定义游戏地图的二维对象列表,其中每个对象代表该地图上的一个图块。当我重新使用其他代码时,我想知道使用字典存储地图数据或继续使用列表是否更有意义。使用列表,索引表示映射的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)
它不多,但它有点清洁,如果它没有任何慢,没有其他缺点,我认为没有理由不。
答案 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
的密钥)那么你可能会获得最好的世界。