我是操作员的计时性能,我发现:
>>> timeit.timeit("10000000<2 or 10000000>1000",number=10000000)
0.4213107880004827
>>> timeit.timeit("(10000000<2) | (10000000>1000)",number=10000000)
0.5472174039969104
>>> timeit.timeit("1000<200000 or 100>1000",number=10000000)
0.26014828799998213
>>> timeit.timeit("(1000<200000) | (100>1000)",number=10000000)
0.49938497000039206
尽管差异有时很小,但在这些大的数字比较中,or
始终优于|
(我真的不确定这是否是因为大的数字(。
但随后:
>>> timeit.timeit("0 or 1",number=10000000)
Out[134]: 0.17863203100023384
>>> timeit.timeit("0 | 1",number=10000000)
Out[135]: 0.06668136799999047
>>> timeit.timeit("00000 | 111111",number=10000000)
Out[136]: 0.06739834499967401
>>> timeit.timeit("00000 or 111111",number=10000000)
Out[137]: 0.1818816989998595
>>> timeit.timeit("True or False",number=10000000)
Out[138]: 0.12497510200046236
>>> timeit.timeit("True | False",number=10000000)
Out[139]: 0.06938139100020635
>>> timeit.timeit("False | True",number=10000000)
Out[140]: 0.0667262490005669
>>> timeit.timeit("False or True",number=10000000)
Out[141]: 0.1443343150003784
发生了什么事?这是意料之中的事吗?我相信|
总是检查两个操作数,即使第一个操作数计算为True
。所以,至少对于第一个操作数是True
的情况,or
不应该一直更快吗?
or和|根本不是同一个运算符。
or
执行逻辑快捷方式,或者|
执行逐位或
result = expression1 or expression2
与相同
if bool(expression1):
result = expression1
else:
result = expression2
因此,如果表达式1是真,则表达式2甚至不会被评估
而:
结果=表达式1|表达式2
执行逐位或同时执行两个值。因此表达式1和表达式2必须产生整数。(True解释为整数1(
例如,下面的输出
In [8]: "{0:b}".format(0b100 | 0b001)
Out[8]: '101'
In [9]: "{0:b}".format(0b100 or 0b001)
Out[9]: '100'
澄清:如果|
/或'右侧的运算符评估速度很快,则它可能会创建更快的"|",因为它将创建无分支代码。
另一方面,如果右侧的运算符是CPU密集型的,而左侧有时是真有时是假,则or
会更快。
在您的示例中,右手边是一个简单的整数,因此|
可能会快一点。(与我最初的回答相反(
几乎没有排气时间差的微小操作必须一次又一次地计时。比方说,在一天中的不同时间给它们计时几百次。两者都适用。
timeit的问题是,您在一个运行多个进程的操作系统上执行python,并且您没有一个100%可预测的环境。
所以我会非常小心地解释运行时的微小差异。