Python:在单行for循环中中断for循环&;单行码与分组码的性能比较

Python:在单行for循环中中断for循环&;单行码与分组码的性能比较,python,Python,我有以下代码,我想知道是否可以将其转换为单线for循环 for a,b in myList : sth = calcSth(a, b) if sth > 60 : return True return False 另一个问题是:单行换循环和块代码换循环的性能有什么区别吗?您可以用这个单行线替换整个循环(如果在单行上使用的话,这真的是一个单行线吗?) for a,b in myList : sth = calcSth(a, b)

我有以下代码,我想知道是否可以将其转换为单线for循环

for a,b in myList :
     sth = calcSth(a, b)
     if sth > 60 :
           return True

return False

另一个问题是:单行换循环和块代码换循环的性能有什么区别吗?

您可以用这个单行线替换整个循环(如果在单行上使用
的话,这真的是一个单行线吗?)

for a,b in myList :
     sth = calcSth(a, b)
     if sth > 60 :
           return True

return False
any
将在a
a、b
与条件匹配时立即停止测试

此外,根据您上次的编辑,如果您计划在循环结束后立即返回
False
,如果没有匹配项,您可以通过以下方式替换整个例程:

return any(calcSth(a,b)>60 for a,b in myList)
编辑:关于性能,我做了一个快速测试,正如预测的那样,
any
构造比我提供的输入数据快了大约20%(最后是35项和匹配条件,有点“最坏情况”)。如果匹配条件位于列表的开头,则两种结构之间的差异非常小。

可能类似(修改后的):

或者,如果您不想评估完整列表

from itertools import starmap, islice

list(islice(filter(lambda x: x > 60, starmap(calcSth, myList)), 1)) != []

最后一个将在第一个大于60的值之后停止。

严格来说,我不相信有一行代码与您发布的代码等效。正如Jean Francois所回答的,您可以用一行替换循环块,但不需要返回双括号:
any(在myList中是calcSth(a,b)…)
是很好的语法。只有当生成器不是函数调用的唯一参数时,才需要括号。
返回any(myList中a,b的x(a,b)>60)
如果他想在失败时返回False,OP不考虑clearComments。谢谢大家@Mooningrawr我添加了您建议的结构,因为如果没有计算匹配,OP将返回False。这总是返回
False
,因为
filter
对象与所有列表不同。只有在python2中,这才有效,但问题没有标记为python2……您可以添加
return
语句,并根据空列表删除测试。如果不是空的,只需测试列表就会得到
True
+1用于
starmap
资料。“但我不确定仅仅为了使用过滤器而创建一个列表是否对性能有好处。”让·弗朗索瓦·法布同意。在我看来,OP想要找回简单的物体。还同意创建列表来使用它不是最好的方法。OP需要一行。也许最好将try/except StopIteration包装到next(filter…):如果至少有一个元素,则返回True。但是没有一行……因为您在末尾添加了
return False
return any(我的列表中a,b的calcSth(a,b)>60)
from itertools import starmap, islice

list(islice(filter(lambda x: x > 60, starmap(calcSth, myList)), 1)) != []