中止列表理解

时间:2016-11-09 14:14:25

标签: python python-2.7 optimization generator list-comprehension

我在python2.7.12中有一个函数,它从函数f(x)生成一个列表,并取最大值,如下所示:

max( [f(x) for x in range(n)] )

现在我希望在其任何元素大于B的情况下中止列表的生成,并返回该元素。结果与执行相同:

v = -float("inf")
for x in range(n):
    v = max( v, f(x) )
    if v > B: return v
return v

问题是for-loop,虽然生成的元素较少,但运行速度比我目前正在处理的问题的列表理解慢。 有没有办法使用列表推导或simillar生成器方法,但是检查B并中止迭代?这里的目标是仅计算NCESSARY元素,但它比第一个例子(它计算每个元素)运行得更快。

编辑: 我已经尝试了很多你提出的技巧,并为简单实现while循环而安顿下来。我最终得到的最终代码如下:

v = float("-inf")
x = 0
while x < n:
    v = max( v, f(x) )
    if v > B: return v

它运行速度比for-loop快一些,即使可能有更快的解决方案(仍然没有计算所有提议的解决方案,对不起),但我喜欢简单。

谢谢。

2 个答案:

答案 0 :(得分:1)

所以这是一个生成器,它从第一个参数生成值,直到值超过第二个参数:

def generate_until_threshold(iterator, threshold):
    for value in iterator:
        yield value
        if value > threshold:
            return

然后这个有效:

max(generate_until_threshold((f(x) for x in range(n)), B), -float('inf'))

但它不会像列表理解那样快速运行。

答案 1 :(得分:-2)

试试这样:

>>> [x**2 for x in range(10)]

[0,1,4,9,16,25,36,49,64,81]

[x**2 for x in range(10) if x < 7]

[0,1,4,9,16,25,36]

编辑:如果f(x)