You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 11:23:01