Python 通过列表理解加速“any”

Python 通过列表理解加速“any”,python,performance,list-comprehension,any,Python,Performance,List Comprehension,Any,我正在使用带有列表理解的any。当any返回True时,我想打破列表理解。比如说, import time def f(x): time.sleep(2) return x beginTime = time.time() result = any([f(x) == 0 for x in [0,1,3,5,7]]) endTime = time.time() print(endTime - beginTime) 上述代码打印10秒,尽管它可能会在第一次True之后中断迭代,

我正在使用带有列表理解的
any
。当
any
返回
True
时,我想打破列表理解。比如说,

import time

def f(x):
    time.sleep(2)
    return x

beginTime = time.time()
result = any([f(x) == 0 for x in [0,1,3,5,7]])
endTime = time.time()

print(endTime - beginTime)

上述代码打印10秒,尽管它可能会在第一次
True

之后中断迭代,但请使用
生成器表达式
而不是
列表理解
,以避免先形成列表:

result = any(f(x) == 0 for x in [0,1,3,5,7])
(列表理解的方括号不见了)


请注意,
任何
在这两种情况下都有短路行为,但不同之处在于没有形成整个列表。

使用
生成器表达式
而不是
列表理解
,以避免先形成列表:

result = any(f(x) == 0 for x in [0,1,3,5,7])
(列表理解的方括号不见了)


请注意,
any
在这两种情况下都有短路行为,但不同之处在于没有形成完整的列表。

您可以使用生成器,如Mustafa所说,但只能检索真理的第一个元素。 非必需的发电机必须全部消耗,其余部分由海象操作员完成

import time
def f(x):
    time.sleep(2)
    return x

beginTime = time.time()
result = next((wr  for x in [0,1,3,5,7] if (wr := f(x)) ==0))
endTime = time.time()

print(endTime - beginTime)

这只需要最短的时间来检索第一次出现的情况

正如穆斯塔法所说,您可以使用生成器,但只检索真理的第一个要素。 非必需的发电机必须全部消耗,其余部分由海象操作员完成

import time
def f(x):
    time.sleep(2)
    return x

beginTime = time.time()
result = next((wr  for x in [0,1,3,5,7] if (wr := f(x)) ==0))
endTime = time.time()

print(endTime - beginTime)

这只需要最短的时间来检索第一次出现的情况

我认为列表理解不可能做到这一点。在这种情况下,我会使用“正常”循环。我认为这在列表理解中是不可能的。在这种情况下,我会使用“正常”循环。哇,我尝试使用带星号的版本,
any(*[f(x)…])
,但没有想到这一点。谢谢Mustafa。哇,我试着使用星号版本,
any(*[f(x)…])
,但没想到。谢谢穆斯塔法。