【发布时间】:2019-12-29 11:45:37
【问题描述】:
为什么根据 timeit.timeit 函数,代码 boolean = True if foo else False 运行速度比代码 boolean = bool(foo) 快?
if 语句如何能够比 bool 函数本身更快地确定 foo 的正确性?
为什么 bool 函数不简单地使用相同的机制?
当 bool 函数的性能可以通过不同的技术提高四倍时,它的目的是什么?
或者,是不是我误用了 timeit 函数,而 bool(foo) 实际上更快?
>>> timeit.timeit("boolean = True if foo else False", setup="foo='zon-zero'")
0.021019499999965774
>>> timeit.timeit("boolean = bool(foo)", setup="foo='zon-zero'")
0.0684856000000309
>>> timeit.timeit("boolean = True if foo else False", setup="foo=''")
0.019911300000103438
>>> timeit.timeit("boolean = bool(foo)", setup="foo=''")
0.09232059999999365
看看这些结果,True if foo else False 似乎比bool(foo) 快四到五倍。
我怀疑速度的差异是由调用函数的开销引起的,当我使用 dis 模块时似乎确实是这种情况。
>>> dis.dis("boolean = True if foo else False")
1 0 LOAD_NAME 0 (foo)
2 POP_JUMP_IF_FALSE 8
4 LOAD_CONST 0 (True)
6 JUMP_FORWARD 2 (to 10)
>> 8 LOAD_CONST 1 (False)
>> 10 STORE_NAME 1 (boolean)
12 LOAD_CONST 2 (None)
14 RETURN_VALUE
>>> dis.dis("boolean = bool(foo)")
1 0 LOAD_NAME 0 (bool)
2 LOAD_NAME 1 (foo)
4 CALL_FUNCTION 1
6 STORE_NAME 2 (boolean)
8 LOAD_CONST 0 (None)
10 RETURN_VALUE
根据dis模块,这两种技术的区别在于:
2 POP_JUMP_IF_FALSE 8
4 LOAD_CONST 0 (True)
6 JUMP_FORWARD 2 (to 10)
>> 8 LOAD_CONST 1 (False)
对比
0 LOAD_NAME 1 (bool)
4 CALL_FUNCTION 1
这使得函数调用对于像确定布尔值这样简单的事情来说看起来过于昂贵,或者 bool 函数的编写效率非常低。 但这实际上让我想知道为什么有人会在 bool 函数这么慢的时候使用它,以及为什么 bool 函数甚至在 python 内部似乎没有使用它时仍然存在。
那么,bool 函数的速度慢是因为它的编写效率低下,还是因为函数开销,还是因为其他原因?
当有更快且同样清晰的替代方案可用时,为什么有人会使用 bool 函数?
【问题讨论】:
标签: python optimization