为何两段功能近似的any生成器代码执行速度存在差异?
两段Python代码执行速度差异的原因分析
问题背景
两段Python代码功能近似且执行结果相同,但通过timeit测试发现第二个代码片段的执行速度显著快于第一个,请问其原因是什么?
代码示例
from timeit import timeit lst = [0] * 10000000 txt1 = "any(i % 2 for i in lst)" txt2 = "any(True for i in lst if i % 2)" print(timeit(txt1, globals=globals(), number=2)) print(timeit(txt2, globals=globals(), number=2))
测试结果
Time : 2.112963530991692 Time : 0.9412867689970881
原因分析
核心差异在于生成器表达式的逻辑位置和any()函数的短路触发时机:
对于
any(i % 2 for i in lst):
生成器会遍历列表中的每一个元素,先执行i % 2计算出布尔值,再将这个值传递给any()函数判断。由于测试列表全是0,i%2的结果始终为False,any()必须遍历完整个列表的所有元素后,才能确定没有真值,最终返回False,全程没有提前终止的机会。对于
any(True for i in lst if i % 2):
生成器把i % 2作为过滤条件,只有当i%2为True时,才会生成True这个值传入any()。因为列表里全是0,i%2永远为False,生成器不会产生任何元素,any()检测到生成器为空后会直接返回False,完全不需要遍历整个列表。
此外,第二种写法的过滤逻辑在生成器内部完成,减少了向any()传递每个i%2结果的额外开销,进一步提升了执行效率。
内容的提问来源于stack exchange,提问作者S. Jacson
相关产品推荐
相关产品推荐

