我是一个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
答案 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
。