Python 3.12中的计时结果(在不同机器上与Python 3.11和Python 3.13类似):

When x = None:
13.8 ns  x is None
10.1 ns  if x is None: pass

When x = True:
13.9 ns  x is None
11.1 ns  if x is None: pass

more怎么能花less个时间呢?

为什么if x is None: pass更快,当它必须做相同的x is None判断,然后额外判断结果的真值(并做或跳过pass)?

其他版本/计算机上的时间:

  • Python3.11:(12.4,9.3)和(12.0,8.8)
  • Python3.13:(29.1,24.6)和(29.1,22.6)

基准脚本(Attempt This Online!):

from timeit import repeat
import sys

for x in None, True:
    print(f'When {x = }:')
    for code in ['x is None', 'if x is None: pass'] * 2:
        t = min(repeat(code, f'{x=}', repeat=100))
        print(f'{t*1e3:4.1f} ns ', code)
    print()

print('Python:', sys.version)

推荐答案

查看反汇编代码:

>>> import dis
>>> dis.dis('if x is None: pass')
  0           0 RESUME                   0

  1           2 LOAD_NAME                0 (x)
              4 POP_JUMP_IF_NOT_NONE     1 (to 8)
              6 RETURN_CONST             0 (None)
        >>    8 RETURN_CONST             0 (None)
>>> dis.dis('x is None')
  0           0 RESUME                   0

  1           2 LOAD_NAME                0 (x)
              4 LOAD_CONST               0 (None)
              6 IS_OP                    0
              8 RETURN_VALUE

if有一个特殊的POP_JUMP_IF_NOT_NONE运算,比LOAD_CONSTIS_OP快.你可以在这里阅读关于它的详细讨论:https://github.com/faster-cpython/ideas/discussions/154.

Python相关问答推荐

Python daskValue错误:无法识别的区块管理器dask -必须是以下之一:[]

如何检测背景有噪的图像中的正方形

2D空间中的反旋算法

计算组中唯一值的数量

Python解析整数格式说明符的规则?

所有列的滚动标准差,忽略NaN

移动条情节旁边的半小提琴情节在海运

提取相关行的最快方法—pandas

删除marplotlib条形图上的底边

如何在Python中获取`Genericums`超级类型?

使用Python查找、替换和调整PDF中的图像'

在Python中计算连续天数

Pandas:计算中间时间条目的总时间增量

jsonschema日期格式

如何在验证文本列表时使正则表达式无序?

类型对象';敌人';没有属性';损害';

替换包含Python DataFrame中的值的<;

在Pandas 中以十六进制显示/打印列?

Python:在cmd中添加参数时的语法

正则表达式反向查找