嵌套循环或' in'哪个更快?

时间:2018-06-05 15:42:30

标签: python time big-o

我是一个python新手,正在研究一些基本的编码挑战,并希望有人可以解释以下哪些代码片段运行得更快。关键是看列表中是否有一对整数加起来为100:

list = [1,2,3,99,5]
for i in list:
    for j in list:
       if i + j == 100:
          return True 

或:

list = [1,2,3,99,5]
for i in list: 
    diff = 100 - i 
    if diff in list:
        return True

1 个答案:

答案 0 :(得分:3)

基准

这个自制的随机基准测试表明,在大多数情况下使用import time, random def time_it(f, rep=100000): sample = [[random.randint(0, 100) for _ in range(20)] for _ in range(rep // 100)] start = time.time() for i in range(rep): f(sample[i % len(sample)]) return (time.time() - start) def nested_for(lst): for i in lst: for j in lst: if i + j == 100: return True def nested_in(lst): for i in lst: diff = 100 - i if diff in lst: return True print('for:', time_it(nested_for)) print('in:', time_it(nested_in)) 的解决方案明显更快。我没有调查,但我确实遇到了一些运行,其中嵌套for循环的解决方案在使用样本大小时稍微快一些。

for: 0.7093353271484375
in: 0.24253296852111816

输出

j

在每次迭代中删除in的赋值可能会消除使用set的解决方案中的巨大开销。

改进

虽然注意两个解决方案都是 O(n 2 。您可以使用set来实现 O(n)。由于def contains_diff(lst): elements = set(lst) return any(100 - i in elements for i in elements) print(contains_diff([1, 2, 3, 99])) # True print(contains_diff([1, 2, 3])) # False 哈希其项目,因此查找 O(1)

in

有趣的是,如果您对上述内容进行基准测试,它通常会慢于in解决方案。这是因为100在随机列表中快速找到set之和的概率相对较高。如果您希望增加您想要的差异,那么构建set的开销可以通过list查找的速度快速得到补偿。

旁注

作为旁注,您不应将list用作变量名,因为它会覆盖内置With .Range("AR2") .Formula = "=IF(F2=""X"",VLOOKUP(A2,[PS_Export.xlsx]ps!$A:$AH,34,FALSE),IF(F2="""",=AS2+AU2+AX2)))" .AutoFill Destination:=Range("AR2:AR" & lastrow) End With