【问题标题】:List or Dictionary for storing game map用于存储游戏地图的列表或字典
【发布时间】:2013-01-24 20:40:14
【问题描述】:

所以我目前有一个定义游戏地图的对象的 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)

它不多,但它有点清洁,如果它不慢,也没有其他缺点,我认为没有理由不这样做。

【问题讨论】:

  • 我还会考虑使用具有节点的图形,这些节点的属性包括 am x/y(或类似)坐标、该图块的对象以及表示可以移出/移出的图块的边。可能还要考虑带有权重的边缘,这样从草原穿过沼泽/河流等......比移动到另一个草原更难......

标签: python list dictionary


【解决方案1】:

我会提防过早的优化。

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

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

【讨论】:

  • 就像我说的,我正在将此地图结构重新用于其他用途,因此此时架构更改并不重要。是的,现有的解决方案有效,但我认为我看到了字典可能带来的一些优势,尽管我不想切换是否会因为某种原因使其运行明显更糟,或者如果还有其他一些我没有想到的事情从长远来看,这可能会使使用字典变得不受欢迎
  • 我的意思是,除非存在性能问题,或者您将处理如此大量的数据,以至于即使是很小的性能差异也会很重要,否则请选择概念上最干净的架构,而不是最高性能的架构.
  • 是的,这就是我添加问题的原因。我设想自己使用它的方式在概念上更清晰,但如果你或其他人看到一个潜在的缺陷,比如“肯定会起作用,但如果你想在周边做一个循环,它会更难做,因为b"(并不是说这实际上是个问题),那么我会很高兴听到它。
  • 这大大澄清了你的问题。您可能还想在 Code Review 网站上发帖。我能想象的唯一缺点是,将给定的图块与附近的图块进行比较可能会更困难,因为列表切片语法使这变得如此简单。如果您愿意,我可以对此进行扩展。
  • 当你说它时我的第一个想法是像 tiles[i-1:i+1][e-1:e+1],但我不确定这是否可行(从逻辑上讲,这将构成一个 3x3 列表)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 在我的例子中,没有一个瓦片是无数据的,因为它们包含瓦片集信息,所以我必须实例化整个矩形
    猜你喜欢
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 2013-08-21
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多