Python 3.11中简洁循环比复杂循环更慢的性能差异疑问
Python 3.11中简洁循环比复杂循环更慢的性能差异疑问
我最近碰到了个让我摸不着头脑的性能问题:当传入参数 n = 10**8 时,看起来写法更简洁的循环反而比结构更复杂的循环慢不少,我实在搞不懂其中缘由。
先看看两个函数的定义:
def simple(n): while n: n -= 1 def complex(n): while True: if not n: break n -= 1
我多次测试得到的耗时结果(单位:秒):
- simple: 4.340795516967773
- complex: 3.6490490436553955
- simple: 4.374553918838501
- complex: 3.639145851135254
- simple: 4.336690425872803
- complex: 3.624480724334717
我的Python版本是:3.11.4 (main, Sep 9 2023, 15:09:21) [GCC 13.2.1 20230801]
为了搞清楚底层原因,我用dis.dis()查看了两个函数的字节码:
simple函数的循环部分字节码:
6 >> 6 LOAD_FAST 0 (n) 8 LOAD_CONST 1 (1) 10 BINARY_OP 23 (-=) 14 STORE_FAST 0 (n) 5 16 LOAD_FAST 0 (n) 18 POP_JUMP_BACKWARD_IF_TRUE 7 (to 6)
complex函数的循环部分字节码:
10 >> 4 LOAD_FAST 0 (n) 6 POP_JUMP_FORWARD_IF_TRUE 2 (to 12) 11 8 LOAD_CONST 0 (None) 10 RETURN_VALUE 12 >> 12 LOAD_FAST 0 (n) 14 LOAD_CONST 2 (1) 16 BINARY_OP 23 (-=) 20 STORE_FAST 0 (n) 9 22 JUMP_BACKWARD 10 (to 4)
从字节码来看,complex函数每轮循环反而要执行两次跳转,而simple函数只有一次跳转,理论上应该更慢才对,但实际测试结果却完全相反。
而且看起来这是Python 3.11特有的现象,相关评论也印证了这一点。
我用来测试的基准脚本如下:
from time import time import sys def simple(n): while n: n -= 1 def complex(n): while True: if not n: break n -= 1 for f in [simple, complex] * 3: t = time() f(10**8) print(f.__name__, time() - t) print('Python:', sys.version)
为什么会出现这种反直觉的性能差异呢?
备注:内容来源于stack exchange,提问作者Kelly Bundy
相关产品推荐
相关产品推荐

