链表的内存优化

2024-09-22 18:27:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近制作了一个脚本来生成随机迷宫,它使用一个自定义的迷宫类,由几个迷宫节点构建而成。每个节点如下所示:

class mazeNode:
    def __init__(self, pos, conn = None):
        self.pos = pos
        if conn:
            self.conns = [conn]
        else:
            self.conns = []

conn是另一个mazeNode对象,self.conns在创建迷宫的过程中被更改,以包括节点连接到的每个mazeNode对象。pos是一个具有节点位置的元组。创建迷宫时,会创建mazeNode对象,并根据深度优先搜索算法以分支方式链接在一起。在

这个脚本运行得很好,可以在10秒内创建一个500*500大小的迷宫。然而,它似乎不是很有效的记忆。我已经成功地创建了一个大小为6000*6000的迷宫,但是当我尝试10000*10000时,无论我做什么,我都会得到一个内存错误,即使我分配了50GB的虚拟RAM。对于这个大小,我得到了10^8个mazeNode对象。在

我试着使用shelve模块,但是这太慢了,以至于无法使用,对于更大的迷宫,我得到了一个递归深度错误(可能是因为不必要的递归,脚本很慢)。在

我想知道是否有任何方法可以在保持速度的同时优化脚本的内存使用。所有的节点都链接在一起,但它们不一定都在RAM中。在

编辑 迷宫类如下:

^{pr2}$

编辑2:

我使用了插槽:并编辑了mazeNode类,如下所示:

class mazeNode:
    __slots__ = ('posx', 'posy', 'conns', )

    def __init__(self, pos, conn = None):
        self.posx = pos[0]
        self.posy = pos[1]
        self.conns = [conn] if conn else []

并使用sys.getsizeof()获取类实例的大小。在

print(sys.getsizeof(self.maze), sys.getsizeof(self.maze.posx), sys.getsizeof(self.maze.posy), sys.getsizeof(self.maze.conns))

打印64 28 28 96。但是,如果我去掉__slots__,我得到56 28 28 96,这看起来很奇怪。我该怎么解释?__slots__工作不正常吗?在


Tags: 对象posself脚本编辑节点sysconn
1条回答
网友
1楼 · 发布于 2024-09-22 18:27:36

^{}使用非常简单,只需将它们添加到类定义中即可:

class MazeNode(object):
    __slots__ = ('pos', 'conn', )

    def __init__(self, pos, conn=None):
        self.pos = pos
        self.conns = [conn] if conn else []

唯一需要记住的是,时隙类型/类不能动态地添加属性。只能设置和/或修改__slots__中列出的属性。即使它们显著地减少了每个对象的内存使用量,也不要疯狂地为每个定义的类定义插槽。要明智,公正地使用它们。在

相关问题 更多 >