当从大型数据集中解析对象时,我经常发现自己将信息聚合到集合对象中,然后将它们转换为列表以对它们进行排序。
例如,这里可能是一段代码片段:
all_times = set([])
for row in dataset:
time = parse_out_time(row)
all_times.add(time)
sorted_times = sorted(list(all_times))
我的问题是最后的任务。我可以使用排序列表重新分配相同的变量名称
all_times = sorted(list(all_times))
我知道python有自动垃圾收集功能,可以删除分配给不重用的旧变量名的数据。这种方法似乎允许Python解释器立即解除分配属于all_times的旧集合版本的内存。如果我们在几百万个数据集的循环中运行上述代码,这可能很重要。
是否应该使用您永远不会再使用的变量名称来提供任何性能优势?或者Python的垃圾收集器是否足够聪明,可以立即为那些从未被脚本再次调用的变量重新分配内存?
答案 0 :(得分:2)
Python不对代码进行任何静态分析。它将保持绑定到变量的对象的引用计数,直到该变量超出范围(例如,在return
上),该变量被重新分配(all_times = sorted(list(all_times)
)或被删除({{1 }})。对于del all_times
,您还可以执行set
以删除包含的数据。这四种方法都是合理的方法来摆脱不再需要的容器。
请注意,所包含的数据仍在all_times.clear()
中。所有你摆脱的是集合使用的哈希表。无论如何,它可能没那么大的帮助。
答案 1 :(得分:0)
如果你做对了(根据你的需要),我认为不会花这么多资源。
我的意思是,如果将此代码运行到循环中,您仍将只使用2个变量。
如果将此代码放入函数中,并将函数运行到循环中,情况就会略有不同。如果将此函数作为多线程任务运行,它会消耗更多。