检查列表中的n个项目是否与python中的条件匹配的最快方法

use*_*473 0 python

如果我在列表中有m个项目,那么检查列表中的n个项目是否满足特定条件的最快方法是什么?例如:

l = [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

如何检查列表中的任何两项是否符合条件x%2 == 0

天真的方法是使用嵌套for循环:

for i in l:
    for j in l:
        if not i%2 and not j%2:
            return True
Run Code Online (Sandbox Code Playgroud)

但这是一种非常低效的检查方式,如果我想在200万到1000万件物品的清单中检查任何50,000件商品,那将变得特别难看.

Joh*_*nck 8

[编辑反映完全匹配,我们仍然可以通过短路完成!]

我想你想让它短路(确定时停止,不仅在最后):

matched = 0
for i in l:
    if i%2 == 0:
        matched += 1
        if matched > 2: # we now have too many matches, stop checking
            break
if matched == 2:
    print("congratulations")
Run Code Online (Sandbox Code Playgroud)

如果你想在相同的输入数据上多次快速地进行查询,你应该使用NumPy(没有短路):

l = np.array([1,2,3,4,5])

if np.count_nonzero(l%2 == 0) == 2:
    print "congratulations"
Run Code Online (Sandbox Code Playgroud)

这不会短路,但是一旦构造了输入数组,它就会超快,所以如果你有一个很大的输入列表和大量的查询,那么查询就不会很早就发生短路,这可能会更快.可能是一个数量级.