下面是一些迭代编写的代码,与DBSCAN算法有轻微的相似之处:
rw = 100
for r in range(rw):
neighs = retrieve_neighs(r)
# rest of body
如果我使用递归重写它,我可能会写:
rw = 100
def foo(r):
if r < rw:
neighs = retrieve_neighs(r)
# rest of body
foo(r + 1)
foo(0)
我希望retrieve_neighs返回一个列表(或一些集合) - 这样就可以加载整个数据文件,对吗?
之后是否认识到没有使用嘶声?foo(r + 1)
所以内存嘶声指的是被释放?
答案 0 :(得分:3)
你所描述的是尾部调用优化的一个主要影响,Python明确没有这样做,因为Guido认为它isn't worth the tradeoffs,特别是在调试信息方面。如果算法的递归版本更清楚,您可能会考虑在不再需要它时明确地执行del neighs
- 这具有保存效果,因为变量超出范围,可能使其符合垃圾回收的条件。