【发布时间】:2019-10-24 08:26:21
【问题描述】:
我在给运营商计时性能,我发现了这个:
>>> 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是逻辑或。他们是两个不同的运算符。 -
是的,我明白了。但是为什么在某些情况下
bitwise更快,而在其他情况下logical?它所比较的只是Truthy和Falsy。 -
因为它没有比较 Truthy 和 Falsy。它执行按位运算。
-
好的,所以
|在True和False(实际上是1 和0)之间执行按位运算,or在True和False之间执行逻辑运算。那么他们的表现不应该在所有情况下都保持一致吗?例如对于整数包含检查,1 in range(1,5)总是比0<1<5慢,因为它们的工作方式不同,那为什么不在这里呢? -
or将在第一个真实部分停止,因此不必评估任何后续部分。|需要这两个部分,并对其执行计算,然后然后仍然评估该计算的结果。
标签: python performance logical-operators boolean-logic