Python 遍历列表而不创建不需要的对象
我通常这样做:Python 遍历列表而不创建不需要的对象,python,loops,iteration,list-comprehension,Python,Loops,Iteration,List Comprehension,我通常这样做: [worker.do_work() for worker in workers] 这样做的优点是可读性很强,并且只包含在一行中,但是创建一个我不需要的对象(列表)的问题,这意味着垃圾收集会被不必要地触发 显而易见的选择是: for worker in workers: worker.do_work() 也非常可读,但使用两行 在不创建不必要的对象的情况下,是否有一种单行方法可以实现相同的结果?python中的“GC”与java有很大的不同。参考计数递减比标记和扫描便宜
[worker.do_work() for worker in workers]
这样做的优点是可读性很强,并且只包含在一行中,但是创建一个我不需要的对象(列表)的问题,这意味着垃圾收集会被不必要地触发
显而易见的选择是:
for worker in workers:
worker.do_work()
也非常可读,但使用两行
在不创建不必要的对象的情况下,是否有一种单行方法可以实现相同的结果?python中的“GC”与java有很大的不同。参考计数递减比标记和扫描便宜得多。对其进行基准测试,然后确定您是否过于强调小成本
要使它成为一个单行程序,只需定义一个helper函数,然后用一行代码来调用它。如果方便的话,将函数埋藏在导入的库中。当然,有
def doLotsOfWork(wks):
for w in wks:
w.do_work()
现在,你的“一行”:
简而言之,除了使用
for
循环之外,没有“更短”(或更好)的方法。我建议您不要使用列表理解,因为它会产生副作用-这就是代码气味。为什么您关心在一行中执行它?@BrenBarn我经常这样做,我希望代码尽可能精简,同时保持可读性。对于worker-in-workers:worker.do_-work()
用作一行程序…@KenY-N非PEP8合规性一行程序样式被列为“宁愿不”而不是“绝对不”。您所说的“辅助功能”是什么意思。你能展示一下示例代码吗?没关系,我理解你的意思。我想知道增加函数调用开销是否比踢GC更糟糕。我不明白你为什么会对这样或那样的代价感到疑惑。把它放在凳子上看看。把时间数字贴在这里。哈哈。在这里,我读到了第一行“当然有”@KaushikNP是的,这是一个高潮
doLotsOfWork(workers)