我知道答案很可能是“不”!

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

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

现在,我知道了sys.setrecursionlimit(),并且做了一些实验来找出需要为图形大小设置限制的大小,因此这是“最简单”的选项。我知道我可以退出节点到节点的链接,然后依靠dict-of-dicts来维护网格,并依靠一个单独的扁平结构来维护边缘权重,但是我有很多原因想要避免不仅如此,节点到节点的链接还可以更直观地使用数据结构。我相信,根据我所读的内容,我应该能够提供自己的__getstate____setstate__实现并覆盖酸洗功能,但是显然这是一笔不小的工作。如果有办法让cPickle(或泡菜,我不大惊小怪!)使用广度优先遍历,它应该很简单地解决问题!

最佳答案

毕竟,编写合适的__getstate__()方法似乎并不那么复杂。尝试类似

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


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

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

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

10-10 18:21