【发布时间】:2020-01-24 17:11:53
【问题描述】:
我在 Python 中编写了以下递归函数来索引 list 的 str 值(可能在列表中多次重复相同的值)。该函数接受list 并返回dict,其中字典的每个条目是项目列表(str)和对应的int 索引。
def make_indices(entries):
def _make_indices(ent, idxs, idx):
if not ent:
return idxs
else:
_make_indices(ent[1:], idxs, idx) if ent[0] in idxs \
else _make_indices(ent[1:], dict({ent[0]: idx}, **idxs), idx+1)
return _make_indices(entries, {}, 0)
我认为这将是一个优雅的解决方案,但它的内存使用会随着列表的长度而迅速增加。有人能解释导致这种过度内存使用的确切原因吗?
【问题讨论】:
-
我的 Python 很弱,所以这主要是一个猜测——你是否在每个递归步骤中都复制列表/字典?如果是这样,您必须等到整个算法停止以清除所有这些,同时您将持有一个列表的多个副本或至少其中的一部分。这可能会有
O(n!)的空间复杂度。 -
您是否看到堆栈溢出或过度使用内存?这里可能存在二次内存消耗问题,因为在递归结束之前所有临时对象都没有从堆栈中清除(以及构建所有这些临时对象的二次运行时问题),但您可能会在此之前遇到堆栈溢出一个大问题。
-
另外你忘了
return在else分支,所以这个函数通常会返回None。 -
@user2357112supportsMonica 不错!谢谢。我确实同意在代码中的某处进行了复制,但我想知道在函数的每次递归调用中复制的究竟是什么使内存使用量增长得如此之快。
标签: python recursion memory-management