如果我在列表中有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件商品,那将变得特别难看.
[编辑反映完全匹配,我们仍然可以通过短路完成!]
我想你想让它短路(确定时停止,不仅在最后):
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)
这不会短路,但是一旦构造了输入数组,它就会超快,所以如果你有一个很大的输入列表和大量的查询,那么查询就不会很早就发生短路,这可能会更快.可能是一个数量级.