Python:在单行中打破一个for循环for loop&单行与块码的性能

时间:2016-10-21 18:32:24

标签: python

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

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

return False

另一个问题是:循环的单行和循环的块代码的性能是否存在差异?

3 个答案:

答案 0 :(得分:4)

你可以用这个oneliner替换你的整个循环(在一行上使用if时这真的是一个oneliner吗?):

if any(calcSth(a,b)>60 for a,b in myList): return True
只要any符合条件,

a,b就会停止测试。

另外,根据您的上一次修改,如果您计划在循环后立即返回False,如果没有匹配,您可以通过以下方式替换整个例程:

return any(calcSth(a,b)>60 for a,b in myList)
编辑:关于性能,我做了一个快速测试,正如预测的那样,我提供的输入数据any构造大约快20%(最终有35个项目和匹配条件,类型& #34;最糟糕的情况")。如果匹配条件位于列表的开头,则两个结构之间的差异非常小。

答案 1 :(得分:1)

也许是这样的(修改):

from itertools import starmap

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

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

from itertools import starmap, islice

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

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

答案 2 :(得分:0)

严格来说,我认为没有单行等同于您发布的代码。正如让 - 弗朗索瓦回答的那样,您可以用一行替换循环块,而不是return