为什么对于不同的值,"|"和"or"之间的性能差异不同



我是操作员的计时性能,我发现:

>>> 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%可预测的环境。

所以我会非常小心地解释运行时的微小差异。

相关内容

  • 没有找到相关文章

最新更新