用于存储游戏地图的列表或字典
我现在有一个二维列表,里面存放着一些对象,这些对象代表了游戏中的地图,每个对象就是地图上的一个瓦片。在我把这段代码用到其他地方的时候,我在想,使用字典来存储地图数据是不是更合适,还是继续用列表。用列表的话,索引就代表了地图上的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)
或者查找字典中的项目会从
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 个回答
这是一个很好的参考,讲的是Python中的列表和字典在速度和内存使用上的对比:https://stackoverflow.com/a/513906/1506904
只要你处理的数据集不是特别大,你现在的方法如果运行得不错,基本上就足够用了。
我不确定你能否得到“正确”的答案,但当我用Python创建《生命游戏》时,我使用了一个dict
(字典)。实际上,多维列表和dict
的查找速度差不多(都是O(1)),但如果你用dict
,那么就不需要一次性创建整个游戏棋盘。在国际象棋中,这意味着你只需要创建32个棋子,而不是64个格子加32个棋子。而在围棋中,你甚至只需要创建1个对象,而不是361个列表单元。
不过,使用dict
时,你还是需要创建tuple
(元组)。如果你能缓存这些元组(或者只遍历dict
的键),那么你可能会得到最好的效果。
我对过早优化这件事持谨慎态度。
你现在的方法性能真的很差吗?你用的数据结构是不是让你写代码或者理解代码变得更难了?
如果你没有遇到什么具体的问题,而这些问题又无法用你现在的架构来解决,那我建议你不要轻易去改变它。