Python:为什么"not not x"的速度是"bool(x)"的两倍多



考虑一下:

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

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

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

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

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

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

最新更新