是否应该覆盖变量名称可以带来任何性能优势?

时间:2017-05-15 16:20:21

标签: python python-3.x

当从大型数据集中解析对象时,我经常发现自己将信息聚合到集合对象中,然后将它们转换为列表以对它们进行排序。

例如,这里可能是一段代码片段:

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的垃圾收集器是否足够聪明,可以立即为那些从未被脚本再次调用的变量重新分配内存?

2 个答案:

答案 0 :(得分:2)

Python不对代码进行任何静态分析。它将保持绑定到变量的对象的引用计数,直到该变量超出范围(例如,在return上),该变量被重新分配(all_times = sorted(list(all_times))或被删除({{1 }})。对于del all_times,您还可以执行set以删除包含的数据。这四种方法都是合理的方法来摆脱不再需要的容器。

请注意,所包含的数据仍在all_times.clear()中。所有你摆脱的是集合使用的哈希表。无论如何,它可能没那么大的帮助。

答案 1 :(得分:0)

如果你做对了(根据你的需要),我认为不会花这么多资源。

我的意思是,如果将此代码运行到循环中,您仍将只使用2个变量。

如果将此代码放入函数中,并将函数运行到循环中,情况就会略有不同。如果将此函数作为多线程任务运行,它会消耗更多。