【问题标题】:Walk a list without creating unneeded object遍历列表而不创建不需要的对象
【发布时间】:2017-10-19 06:05:28
【问题描述】:

我通常这样做:

[worker.do_work() for worker in workers]

这样的好处是可读性很强,并且包含在一行中,但是创建一个我不需要的对象(列表)的问题,这意味着垃圾收集被不必要地触发了。

显而易见的选择:

for worker in workers:
    worker.do_work()

也很易读,但使用了两行。

是否有一种单行方式可以实现相同的结果,而不会创建不必要的对象?

【问题讨论】:

  • 你为什么要在意一行行呢?
  • @BrenBarn 我经常这样做,我希望尽可能减少我的代码,同时保持它的可读性。
  • for worker in workers: worker.do_work() 作为一个班轮工作......
  • @KenY-N 不符合 PEP8
  • 单线风格被列为“宁可不”而不是“绝对不”。

标签: python loops iteration list-comprehension


【解决方案1】:

当然有。

def doLotsOfWork(wks):
    for w in wks:
        w.do_work()

现在,你的“一个班轮”:

doLotsOfWork(workers)

简而言之,除了使用for 循环之外,没有“更短”(或更好的方法)。我建议你不要使用列表推导,因为它会产生副作用——那就是代码异味。

【讨论】:

  • 哈哈。在这里,我读到第一行“肯定有”感到震惊
  • @KaushikNP 是的,这是反高潮。 ;-)
【解决方案2】:

python中的“GC”与java有很大的不同。引用计数递减比标记和扫描便宜得多。对其进行基准测试,然后确定您是否过于强调小成本。

要使其成为单行,只需定义一个辅助函数,然后用一行来调用它。如果方便,将函数埋入导入的库中。

【讨论】:

  • “辅助功能”是什么意思。你能展示示例代码吗?
  • 没关系,我明白你的意思。我想知道添加函数调用开销是否比踢 GC 更糟糕。
  • 我不明白你为什么想知道这个或那个的成本。把它放在凳子上看看。在此处发布时间数据。
猜你喜欢
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-29
  • 2016-11-22
  • 2018-03-10
相关资源
最近更新 更多