繁体   English   中英

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

[英]Why the performance difference between `|` and `or` different for different values?

我正在为操作员计时性能,我发现了这一点:

>>> 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执行逻辑快捷方式或 而| 表现得有点明智或

result = expression1 or expression2 

等同于

if bool(expression1):
    result = expression1
else:
    result = expression2

所以如果 expression1 为真,甚至不计算 expression2

然而:

结果 = 表达式1 | 表达式2

执行位明智或两个值。 所以 expression1 和 expression2 必须产生整数。 (True 被解释为 integer 1)

看看例如跟随 output

In [8]: "{0:b}".format(0b100 | 0b001)                                           
Out[8]: '101'

In [9]: "{0:b}".format(0b100 or 0b001)                                          
Out[9]: '100'

澄清:如果|右侧的运算符 / 'or' 评估速度很快,那么它可能会 '|' 这更快,因为它将创建无分支代码。

另一方面,如果右侧的算子是 CPU 密集型的,而左侧的运算有时为真有时为假,那么or会更快。

在您的示例中,右侧是一个简单的 integer,所以可能| 可能会快一点。 (与我在最初的回答中所说的相反)

几乎没有执行时间差异的微小操作必须一遍又一遍地计时。 假设在一天中的不同时间对它们进行数百次计时。 对彼此而言。

timeit 的问题在于,您在操作系统上执行 python,该操作系统运行多个进程并且您没有 100% 可预测的环境。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM