【问题标题】:Is there a difference in checking if an integer is equal to 0 or not False检查整数是否等于 0 是否有区别 False
【发布时间】:2017-12-26 08:42:29
【问题描述】:

因此,据我所知,在 Python 中检查整数是否为 0 有两种不同的方法。我们可以这样做:

if i == 0:
    ...

if not i:
    ...

第一个可以说更清楚,但是否有任何情况下它们会产生不同的结果或表现更好?

【问题讨论】:

  • 这不适用于i 为整数时,但如果i = [] 则行为不同。
  • if not 检查truthy== 尝试匹配该值,一般来说,如果您只想检查真实的if notif i 更快
  • 如果您知道i 是一个整数,那么就没有区别。使用更清晰的。
  • 至于性能,我想不出这种微优化会有什么不同的情况。

标签: python evaluation


【解决方案1】:

是的,有区别。您可以使用dis 反编译字节码,以观察最低级别发生的情况。

import dis

dis.dis("if i == 0: pass")
  1           0 LOAD_NAME                0 (i)
              3 LOAD_CONST               0 (0)
              6 COMPARE_OP               2 (==)
              9 POP_JUMP_IF_FALSE       15
             12 JUMP_FORWARD             0 (to 15)
        >>   15 LOAD_CONST               1 (None)
             18 RETURN_VALUE

i 与常量值0 显式比较,正如您在6 COMPARE_OP 上看到的那样。同时,对于后一种情况-

dis.dis("if not i: pass")
  1           0 LOAD_NAME                0 (i)
              3 POP_JUMP_IF_TRUE         9
              6 JUMP_FORWARD             0 (to 9)
        >>    9 LOAD_CONST               0 (None)
             12 RETURN_VALUE

您会看到i 的“真实性”已经过测试。 python 中任何具有 false-y 值的东西(00.0False、空字符串和空容器)都被认为是False,因此结果表达式是True

您使用什么取决于您要测试的内容。你想测试一个对象的虚假性吗?还是要测试该值是否为0?后者更加具体,从语义角度来看也略有不同。

哦,如果我们在谈论性​​能,那么 -

%timeit if i == 0: pass
10000000 loops, best of 3: 51.4 ns per loop

%timeit if not i: pass
10000000 loops, best of 3: 39.1 ns per loop

not i 不仅是 Python 的,而且速度更快(虽然速度不是很多,而且结果可能因不同的机器和 Python 版本而异)。

【讨论】:

  • 嗯,你能把你的完整 timeit 案例,在我的案例中 == 比使用 if not i 更快
  • @user1767754 我在 MacOSX 上的 python3.4、Ipython5.2 中计时。时间可能因机器和实现而异,我已添加免责声明。
【解决方案2】:

在速度方面几乎没有区别,但是 == 在我的系统上执行 ~3% 更好,100010**7 比较循环上运行。此外,这是一个您几乎不应该考虑的优化,尤其是使用 python。

if not iif i 这样的查询是在检查给定值的真实性。其中数字0 计算为false,任何更小或更大的计算为true。 同样,在真正决定选择哪一个之前,您应该问自己这个问题,您是在寻找 truthy 还是具有特定价值的 comparison

【讨论】:

    【解决方案3】:
    if i == 0
    

    仅当i 等于0i 等于False 时才会为真,而

    if not i
    

    i 为0、iFalse 以及i 为空集合时为真。

    根据您的尝试,一个可能比另一个更好。

    使用后一种解决方案可能会有非常轻微的性能优势,但这可以忽略不计。代码的清晰性和正确性更为重要。

    【讨论】:

    • 您评论False 将触发哪些情况不属实。 boolint 的子类。它们的定义如下:True == 1False == 0。 (在你的回答中使用空集合([], {}, ())而不是False)。
    • @Dunes 说得好。感谢您向我指出!
    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 2014-12-13
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    相关资源
    最近更新 更多