【问题标题】:Should over-writing variable names give any performance benefits?重写变量名是否应该带来任何性能优势?
【发布时间】:2017-05-16 00:45:02
【问题描述】:

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

例如,这里可能是一个代码 sn-p:

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 的垃圾收集器是否足够聪明,可以立即为脚本不再调用的变量释放内存?

【问题讨论】:

  • 你是什么意思“不再被名字引用”?无论您是否再次通过它访问它们,它们仍然由该名称引用,直到定义该名称的范围结束。
  • @jonrsharpe 添加了一个说明,即脚本不再调用该变量
  • 那么不,据我所知,没有这样的优化。如果担心持有大的、不需要的对象,你应该明确地del 不再使用的标识符(或将它们分配给其他东西,就像你目前正在做的那样)——这也有利于制作你的代码在缺乏此类优化的实现中正常工作。
  • 关于 Python 中的作业,我发现 Brendan Rhodes 的 talk 非常有启发性
  • ps,afaik 你不必先列出列表来对集合进行排序

标签: python python-3.x


【解决方案1】:

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

请注意,无论如何包含的数据仍在sorted_times 中。您摆脱的只是集合使用的哈希表。无论哪种方式,它都可能没有那么大的帮助。

【讨论】:

    【解决方案2】:

    如果你做得对(取决于你的需要),我认为它不会花费这么多资源。

    我的意思是,如果你将这段代码运行到一个循环中,你仍然只会使用 2 个变量。

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

    【讨论】:

      猜你喜欢
      • 2019-08-03
      • 2017-03-04
      • 1970-01-01
      • 2011-12-18
      • 2015-10-18
      • 2016-08-09
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      相关资源
      最近更新 更多