大型整数列表场景下两段Python代码的执行速度是否存在差异?
首先来看你给出的两段代码:
代码1:
if a in lst or b in lst or c in lst: print("found in lst")
代码2:
if a in lst: print("found in lst") elif b in lst: print("found in lst") elif c in lst: print("found in lst")
嘿,这个问题问得很到位,尤其是面对极大的整数列表时,执行效率的细节确实值得抠一抠。咱们来拆解一下这两段代码的执行逻辑:
首先得明确Python里or运算符的短路求值特性——只要左边的表达式为True,右边的表达式就不会被执行了。那咱们对比两段代码的执行路径:
当
a在lst里时:
代码1的a in lst为True,后面的b in lst和c in lst直接跳过,直接执行print;
代码2的if a in lst条件成立,直接执行print,后面的elif分支全跳过。
这时候两段代码的执行步骤完全一致,速度没差异。当
a不在,但b在lst里时:
代码1先检查a in lst为False,接着检查b in lst为True,跳过c in lst,执行print;
代码2先判断a in lst不成立,进入elif b in lst分支,条件成立执行print,跳过最后一个elif。
这时候两者的检查次数一样,速度也没区别。当
a和b都不在,但c在lst里时:
代码1会依次检查a、b都不在,然后检查c在,执行print;
代码2会依次判断a不在、b不在,最后进入elif c in lst分支执行print。
两者都是检查三次,速度还是一致。当三个都不在
lst里时:
代码1会把三个in检查全跑完,然后什么都不做;
代码2也会把三个条件全判断一遍,然后什么都不做。
执行步骤完全相同,速度没差异。
那这么说,两段代码的执行速度其实是完全一样的?因为它们的底层逻辑都是按顺序进行短路检查,没有额外的开销。
不过如果非要吹毛求疵的话,代码1的条件表达式是一个单独的逻辑判断,代码2是多个分支,但Python解释器对这两种结构的优化其实是一致的,不会有明显的性能差别——尤其是在lst极大的情况下,in操作本身的开销(遍历列表)才是大头,分支结构的差异可以忽略不计。
总结一下:这两段代码在执行速度上没有实质性差异,因为它们的短路检查逻辑完全一致,唯一的区别只是代码写法不同而已。
内容的提问来源于stack exchange,提问作者Nikola

