我在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快一些,即使可能有更快的解决方案(仍然没有计算所有提议的解决方案,对不起),但我喜欢简单。
谢谢。
答案 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)