python - 为什么 `len(l) != 0` 在 CPython 中比 `bool(l)` 快?

标签 python python-3.x performance cpython

我正在做一些关于列表操作速度的实验。为此,我定义了两个列表:l_short = []l_long = list(range(10**7))

想法是将 bool(l)len(l) != 0 进行比较

if 竞赛中,以下实现比 if len(l) != 0: passif l: pass 快很多

但是没有 if 比赛我得到了以下结果:

%%timeit
len(l_long) != 0
# 59.8 ns ± 0.358 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%%timeit
bool(l_long)
# 63.3 ns ± 0.192 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

bool的时间稍长,为什么?

这里是使用 dis (FYI) 的字节码

dis("len(l_long) != 0")
"""
  1           0 LOAD_NAME                0 (len)
              2 LOAD_NAME                1 (l_long)
              4 CALL_FUNCTION            1
              6 LOAD_CONST               0 (0)
              8 COMPARE_OP               3 (!=)
             10 RETURN_VALUE
"""

dis("bool(l_long)")
"""
  1           0 LOAD_NAME                0 (bool)
              2 LOAD_NAME                1 (l_long)
              4 CALL_FUNCTION            1
              6 RETURN_VALUE
"""

最佳答案

bool(l_long) 首先尝试调用 l_long.__bool_();但是,未定义 list.__bool__。下一步是调用 l_long.__len__() != 0

len(l_long) != 0,另一方面,直接进入 l_long.__len__()

您看到的时间差本质上是在调用 l_long.__len__ 之前捕获 l_long.__bool__ 引发的 AttributeError 所花费的时间.

关于python - 为什么 `len(l) != 0` 在 CPython 中比 `bool(l)` 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57413042/

相关文章:

python - 如何进行嵌套列表理解 (Python)

python - Pipfile.lock 已过时。

performance - Windows Server 2008 上的 UDP 性能上限

javascript - WebGL 在各种设备上的性能

c++ - 静态变量会阻碍数据缓存吗?

python - 用Python通过打印机打开till

python - 根据数据框中组内的条件替换值

python - 判断输入列表是否严格递增

python - python 3.9中是否有与|=(管道相等/更新)对应的__dunder__方法?

Python - Selenium - 如何使用浏览器快捷方式