Python中AND条件是否支持惰性求值?大循环代码性能优化问询
Python中AND条件的惰性求值问题
我正在解决一个组合数学问题,已经把它简化为研究问题的渐近行为这个更易处理的任务。当前测试代码用了1E7次迭代,但最终版本需要完成1E11次迭代。代码里的<condition_1>用来把搜索空间缩小到远小于~1E7的规模,<condition_2>通过判断结果是否满足不等式来降低内存负载。我写了两种代码实现方式(Way 1和Way 2),现在用Way 2来期望提升性能,想确认:Python是否会对AND条件进行惰性求值——也就是第一个条件为假时不计算第二个条件?
# Way 1 for i in range(N): <computation related to condition_2, used in code block> if <condition_1> & <condition_2>: <code block> <storing results in dictionary>
# Way 2 for i in range(N): if <condition_1>: <computation related to condition_2, used in code block> if <condition_2>: <code block> <storing results in dictionary>
回答
- Python的逻辑与运算符
and支持惰性求值:当第一个条件为假时,会直接跳过第二个条件的计算,不会执行后续表达式。 - 但你Way 1中使用的
&是按位与运算符,它不具备惰性求值特性,无论第一个条件结果如何,都会先计算<condition_1>和<condition_2>两边的表达式,再执行按位运算。这会导致大量无效计算,完全浪费了<condition_1>的过滤作用。
如果把Way 1里的&替换成and,那么Way 1和Way 2的逻辑等价,性能也会相近。但你的Way 2写法更直观,也避免了在<condition_1>为假时执行<condition_2>的前置计算,在你的场景(<condition_1>过滤掉绝大多数迭代)下,Way 2的效率会更高,和你期望的一致。
内容的提问来源于stack exchange,提问作者theoreticalmasterrace
相关产品推荐
相关产品推荐

