【问题标题】:Python: Why is `not not x` more than twice as fast as `bool(x)` [duplicate]Python:为什么`not not x`是`bool(x)`的两倍多[重复]
【发布时间】:2020-01-15 22:35:50
【问题描述】:

考虑一下:

>>> from timeit import timeit
>>> timeit('x = 1; t = bool(x)')
0.08783805199999506
>>> timeit('x = 1; t = not not x')
0.018457599000015534

现在我知道函数调用通常会给您带来开销,但通常情况下,编译器和解释器会优化小的常见情况(例如这个)。

那么这里到底发生了什么?

【问题讨论】:

  • 这是 Python 和特定调用的工件。这在许多静态编译的语言中并不成立(或者更确切地说,推理会更明显)。两件事情。 1、bool(..)接受可以做什么?这与 not 运算符有何不同? 2. 比较内在运算符与“调用”。
  • 查看为t = bool(x)t = not not x生成的代码。
  • 这让我查看了bool 源代码。这是幕后github.com/python/cpython/blob/master/Objects/boolobject.c

标签: python python-internals


【解决方案1】:

通常,小的常见情况(例如这个)由编译器和解释器优化

也许在带有 JIT 的解释器中,但 Python 的参考实现没有。它确实是在当前全局命名空间字典中执行 bool 名称的哈希查找,但没有找到它,回退到内置命名空间字典中的哈希查找,找到 bool 类型,并执行 __new__ 和 @ 987654324@.

相比之下,not not x 可以跳过所有这些。它仍然需要执行x 的转换为布尔挂钩,但bool(x) 也必须这样做。 not not x 必须做的事情 bool(x) 不是两个否定和一个将 bool 转换为 bool 的操作,但这在 C 级别更直接(并且有一个快速的 bool 到 bool 路径noop 转换)。

【讨论】:

    猜你喜欢
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 2018-02-04
    • 2018-01-06
    • 2011-02-12
    相关资源
    最近更新 更多