考虑一下:
>>> 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 转换有一条快速路径(。