【发布时间】:2016-02-10 16:19:42
【问题描述】:
我使用timeit模块比较了这两个代码sn-ps,发现第二个稍快:
~$ python -m timeit —setup "l=[1, 2];k=1" "l[k==1]"
10000000 loops, best of 3: 0.0414 usec per loop
~$ python -m timeit —setup "l=[1, 2];k=1" "l[0 if k==1 else 1]"
10000000 loops, best of 3: 0.0372 usec per loop
由于逻辑相同,我认为评估布尔对象比整数等价(True == 1 和False == 0)花费更多时间,因此我提出了以下基准,结果证明我是正确的:
~$ python -m timeit —setup "l=range(1000)" "l[False]"
10000000 loops, best of 3: 0.0411 usec per loop
~$ python -m timeit —setup "l=range(1000)" "l[False]"
10000000 loops, best of 3: 0.0394 usec per loop
~$ python -m timeit —setup "l=range(1000)" "l[False]"
10000000 loops, best of 3: 0.0416 usec per loop
~$ python -m timeit —setup "l=range(1000)" "l[True]"
10000000 loops, best of 3: 0.0428 usec per loop
~$ python -m timeit —setup "l=range(1000)" "l[True]"
10000000 loops, best of 3: 0.0394 usec per loop
~$ python -m timeit —setup "l=range(1000)" "l[True]"
10000000 loops, best of 3: 0.0393 usec per loop
~$
~$
~$ python -m timeit —setup "l=range(1000)" "l[0]"
10000000 loops, best of 3: 0.0232 usec per loop
~$ python -m timeit —setup "l=range(1000)" "l[0]"
10000000 loops, best of 3: 0.0232 usec per loop
~$ python -m timeit —setup "l=range(1000)" "l[0]"
10000000 loops, best of 3: 0.0232 usec per loop
~$ python -m timeit —setup "l=range(1000)" "l[1]"
10000000 loops, best of 3: 0.0232 usec per loop
~$ python -m timeit —setup "l=range(1000)" "l[1]"
10000000 loops, best of 3: 0.0232 usec per loop
~$ python -m timeit —setup "l=range(1000)" "l[1]"
10000000 loops, best of 3: 0.0232 usec per loop
但我不知道根本原因是什么。我的意思是为什么评估True 和False 需要更多时间?在基准测试期间,我还注意到了另一件神秘的事情。在基准测试的第一部分,结果有所不同,而第二部分的数字是稳定的。
【问题讨论】:
-
boolean和integer等价was already asked here的区别。 -
好的,谢谢。但是该线程没有讨论关于真/假评估的数字的不稳定性。
-
不稳定很容易:缓存未命中。由于您需要进行查找,因此无法保证您在缓存中命中它,或者您需要去 ram 获取它,或者在基准运行时仍保留在缓存中。所以不稳定。
标签: python performance boolean internals