Python多条件语句求值规则及两种条件写法的性能与执行逻辑疑问
嘿,这两个问题核心都绕不开Python的短路求值特性,咱们掰开揉碎了说:
1. Python中多个条件语句是如何进行求值的?
Python对逻辑运算符and、or采用短路求值(Short-circuit Evaluation)策略,简单说就是:
- 对于
A and B:如果A的布尔值是False,Python会直接返回A的结果,完全不会去计算B——因为不管B是什么,整个表达式的结果肯定是False。 - 对于
A or B:如果A的布尔值是True,Python直接返回A的结果,不会计算B——因为不管B是什么,整个表达式的结果肯定是True。
这种设计不仅能提升性能(避免不必要的计算),还能让代码更安全,比如你可以写if obj is not None and obj.value > 0,不用担心obj为None时访问obj.value会触发报错。
2. 嵌套if vs 单if with and:哪个执行更快?
先直接回答你的子问题:第一种条件语句if x[i] and expensive_computation(y[i])只会在x[i]为True时,才会去检查expensive_computation(y[i])的布尔值。如果x[i]是False,expensive_computation根本不会被调用——这就是短路求值在起作用。
回到“哪种更快”的问题:两种写法在性能上几乎没有差异。因为它们的执行逻辑完全一致:
- 当
x[i]为False时,两种写法都跳过expensive_computation,直接不执行do_something; - 当
x[i]为True时,两种写法都会调用expensive_computation(y[i]),判断其结果为True后才执行do_something。
唯一的区别是可读性:如果你的条件比较复杂,嵌套if可能让逻辑分层更清晰;如果条件简单,单if用and连接会更紧凑。比如你的示例代码里,两种写法的执行效率是一模一样的。
你可以自己跑个测试验证:
import time def expensive_computation(n): time.sleep(0.001) # 模拟耗时计算 return n % 2 == 0 x = [True, False, False, True] * 10000 y = [0,1,2,3] * 10000 # 测试第一种写法 start = time.time() for i in range(len(x)): if x[i] and expensive_computation(y[i]): pass # 代替do_something print(f"单if with and耗时: {time.time() - start:.2f}s") # 测试第二种写法 start = time.time() for i in range(len(x)): if x[i]: if expensive_computation(y[i]): pass # 代替do_something print(f"嵌套if耗时: {time.time() - start:.2f}s")
两次输出的耗时会几乎完全相同,因为它们走的是完全一样的执行路径。
内容的提问来源于stack exchange,提问作者apogalacticon
相关产品推荐
相关产品推荐

