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.board
和 self.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.
获得
我现在使用了一个令人难以置信的卡顿旁路解决方案:
- 将列表转换为字符串
- 使用内置的 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])
为了从我的国际象棋引擎撤消走法,我非常依赖一个良好的缓存系统,它会在每次走法 done/undone 时更新。它还用于“回到过去”并查看更早的位置。更新代码类似于:
self.cache.append([copy.deepcopy(self.board), ..., copy.deepcopy(self.brokenCastles)])
其中 self.brokenCastles
是一个集合,self.board
是表示棋盘的二维列表。还有一些其他的列表和变量被存储(比如每边的合法移动)所以他们不必在每次使用同一块板时都计算。到目前为止它们还没有造成任何问题(或者我没有注意到它们)。
最大的问题是 self.board
和 self.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.
获得我现在使用了一个令人难以置信的卡顿旁路解决方案:
- 将列表转换为字符串
- 使用内置的 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])