copy.deepcopy 的替代品;甚至有必要吗?

Alternatives to copy.deepcopy; Or is it even necessary?

为了从我的国际象棋引擎撤消走法,我非常依赖一个良好的缓存系统,它会在每次走法 done/undone 时更新。它还用于“回到过去”并查看更早的位置。更新代码类似于:

self.cache.append([copy.deepcopy(self.board), ..., copy.deepcopy(self.brokenCastles)])

其中 self.brokenCastles 是一个集合,self.board 是表示棋盘的二维列表。还有一些其他的列表和变量被存储(比如每边的合法移动)所以他们不必在每次使用同一块板时都计算。到目前为止它们还没有造成任何问题(或者我没有注意到它们)。

最大的问题是 self.boardself.brokenCastles。如果我只是像所有其他变量一样追加它们,就会出现大量问题(比如国王被带走和一些奇怪的东西),这可以通过分别对 list/set 进行深度复制来解决。仅使用 pythons 内置 .copy() 或使用像 [:] 这样的切片没有帮助。 我不太清楚为什么 deepcopy 是必要的并且无法在较小的环境中复制问题。所以我的问题是是否甚至需要 deepcopy,如果需要,有没有办法让它更快,因为它现在是我系统中最大的瓶颈。

缓存读取函数如下所示:

def undo_move(self):
        self.board = self.cache[-1][0]
        ... # A lot more 
        self.brokenCastles = self.cache[-1][4]
        self.cache.pop()

如果有任何细节遗漏,请告诉我。感谢您的帮助。

完整代码(一团糟)可在 GitHub.

获得

我现在使用了一个令人难以置信的卡顿旁路解决方案:

  1. 将列表转换为字符串
  2. 使用内置的 eval 函数检索它的信息

仍然很慢,但比 deepcopy 好很多。

编辑:我通过使用自己的字符串转换和返回来使它更快:

def to_lst(my_string):
    temp = my_string.split("|")
    return [temp[i: i+8] for i in range(0, 64, 8)]


def to_str(my_list):
    return "|".join([a for b in my_list for a in b])