gpt4 book ai didi

python - 是否可以强制 cPickle 使用广度优先而不是深度优先递归?

转载 作者:太空宇宙 更新时间:2023-11-04 06:28:54 25 4
gpt4 key购买 nike

我意识到答案很可能是“否”!

基本上,我有一个表示正方形网格的图(节点和边类型);每个节点对象都包含对该节点有边的每个其他节点的引用,这似乎意味着当使用 cPickle.dump 序列化图形时,它以深度优先的方式遍历图形中的每个节点,这意味着对于一个井-表示 16x16 网格的连接图,它有效地将其视为 256 级深度的数据结构。这意味着较大的网格很快就会超过默认的最大 Python 递归深度,特别是因为实验表明它似乎需要大约 4 次堆栈调用才能进入数据结构的额外级别。

问题是,我还有一个 dict-of-dicts,它以允许我使用笛卡尔坐标来查找特定节点的方式引用该图(例如“node = nodes[3][6]” ).所以从概念上讲,它根本不是一个高度嵌套的数据结构,它是一个相当扁平的数据结构,恰好有很多横向引用,但 cPickle 似乎完全是深度优先的(我知道这是迄今为止最简单的方法工作)。

现在,我知道了 sys.setrecursionlimit(),并且我做了一些实验来找出我需要为多大的图形设置限制,所以这是“最简单”的选项。我知道我可以退出节点到节点的链接并依靠 dict-of-dicts 来维护网格和一个单独的平面结构来维护边缘权重,但有多种原因我想避免那——尤其是节点到节点的链接允许更直观地使用数据结构。我相信从我读过的内容来看,我应该能够提供我自己的 __getstate____setstate__ 实现并覆盖 pickling 功能,但显然这是一个非常重要的数量工作的。如果有办法让 cPickle(或 pickle,我不挑剔!)使用广度优先遍历,它应该可以非常简单地解决问题!

最佳答案

编写一个合适的__getstate__() 方法似乎并没有那么复杂。尝试类似的东西

class Node(object):
def __getstate__(self):
state = self.__dict__.copy()
state.pop("neighbours")
return state

这将 pickle Node 实例的所有属性,但 neighbours 属性除外,我假设该属性包含到邻居的链接。 (您不需要 __setstate__() 方法。)

在对整个图进行 unpickling 之后,您将不得不重新创建到所有节点上的邻居的链接,但这也不应该那么困难。

关于python - 是否可以强制 cPickle 使用广度优先而不是深度优先递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5206831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com