【发布时间】:2021-08-09 11:37:25
【问题描述】:
我在想,当我有机会时,我是否应该在不再需要 Python 中分解一个单连接链表,或者我不应该为它烦恼。
列表示例:
class Link:
def __init__(self, next=None):
self.next = next
L = Link(Link(Link(Link())))
断开链接:
def break_(link):
if link is not None:
break_(link.next)
link.next = None # link broken
# application
break_(L)
树示例:
class Node:
def __init__(self, l=None, r=None):
self.l = l
self.r = r
T = \
Node(
Node(
Node(),
Node()
),
Node(
Node(),
Node()
),
)
断开链接:
def break_(node):
if node is not None:
break_(node.l)
break_(node.r)
node.l = None # link broken
node.r = None # link broken
# application
break_(T)
基本上,我想知道的是,在这种情况下编写代码的最佳性能方式是什么。 GC 准备好处理大型链接结构了吗?它是否不必使用计数器等运行可能很长的 DFS 来确定可以释放哪些对象?仅仅断开链接并给 GC 一堆零引用的松散对象不是更简单吗?
我可以对此进行基准测试,但我正在寻找解释(最好来自 Karl),如果有的话。谢谢。
【问题讨论】:
-
谁是 Karl,您的应用/解决方案是否需要对 GC 进行额外控制?
-
我最好不要控制 GC。我只是想知道在 Python 中摆脱链表的更快方法是什么以及为什么。
-
如果您不需要控制 GC,按原样为您的用例编写程序就足够了。当不再需要链表时,GC 会删除链表。
-
我想你关心 CPython 吗?如果是这样,请添加 cpython 标签。 Python 本身是一种语言规范,它不会对 GC 细节强加任何东西。
-
其次,“断开链接”是什么意思?您能否提供一个代码示例来说明如何执行此操作?为什么您认为这比幕后发生的工作要少?
标签: python linked-list garbage-collection