Is >0 faster than !=0 for an int?
哪种测试更快:平等还是不平等?
例如,在一个大的
当问自己一个关于不同操作员之间速度差异的问题时,请使用
1 2 3 4 5 6 7 8 9 | >>> import timeit >>> timeit.timeit('a > 0', 'a = 1', number=10**7) 0.2486400604248047 >>> timeit.timeit('a > 0', 'a = 0', number=10**7) 0.2411360740661621 >>> timeit.timeit('a != 0', 'a = 1', number=10**7) 0.24765801429748535 >>> timeit.timeit('a != 0', 'a = 0', number=10**7) 0.24990510940551758 |
这是比较重复1000万次,如果你重新运行上述测试,你会发现时间可能会有所不同,没有一个是明显的赢家。
你应该专注于这里的可读性,而不是速度。简单的整数比较将成为整体执行速度的无限小部分,即使在循环中也是如此。
如果我们谈论的是
1 2 3 4 5 6 7 8 9 10 | >>> for s in 'a = 2', 'a = 0', 'a = -2': timeit('a != 0', s) timeit('a > 0', s) 0.06030992519848155 0.06666935212976455 0.053299842422489974 0.06516424110179742 0.05866621696540619 0.06685335186756447 |
但是,这些数字与另一个数字非常接近。所以你应该从这个答案中拿出一件事:没关系。
这些东西都是微观优化。微优化很少对应用程序的实际性能产生任何影响。应用程序中有数千个其他部分更有可能对性能产生更大影响,使这种差异可以忽略不计。如果您实际分析了应用程序并确认代码的这一部分是导致应用程序性能下降的瓶颈,那么您应该只关心这些事情。但对于这个特殊的代码,我怀疑情况会是如此。
所以,请不要理会这些微小的差异,而只是使用更有意义的东西:考虑到这两个检查具有不同的语义含义(数字不等于零,或数字大于零),选择一个你真的打算检查一下。
对我来说,
1 2 3 4 5 6 7 8 | >>> timeit.timeit('1 > 0') 0.031796932220458984 >>> timeit.timeit('1 != 0') 0.03249096870422363 >>> timeit.timeit('1 > 0') 0.03250718116760254 >>> timeit.timeit('1 != 0') 0.031616926193237305 |
正如关于这个问题的评论所述,你应该专注于最有意义的运算符,而不是关注哪个运算符是最快的。如果您的意思是"在
我认为这个有点沉重的测试程序显示在字符和整数比较的情况下基本没有区别
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | import string def numericgtmostfail(): for i in range(100): x= i > 99 return x def numericgtmostsucceed(): for i in range(100): x= i > 1 return x def numericnemostsucceed(): for i in range(100): x= i != 99 return x def numericnemostfail(): for i in range(100): x= i != i return x def chgtmostfail(): for s in (string.lowercase * 4)[0:100]: x = s > 'y' return x def chgtmostsucceed(): for s in (string.lowercase * 4)[0:100]: x = s > 'a' return x def chnemostfail(): for s in (string.lowercase * 4)[0:100]: x = s != s return x def chnemostsucceed(): for s in (string.lowercase * 4)[0:100]: x = s != 'a' return x if __name__ == '__main__': import timeit print(timeit.timeit("numericgtmostfail()", setup="from __main__ import numericgtmostfail")) print(timeit.timeit("numericgtmostsucceed()", setup="from __main__ import numericgtmostsucceed")) print(timeit.timeit("numericnemostsucceed()", setup="from __main__ import numericnemostsucceed")) print(timeit.timeit("numericnemostfail()", setup="from __main__ import numericnemostfail")) print(timeit.timeit("chgtmostfail()", setup="from __main__ import chgtmostfail")) print(timeit.timeit("chgtmostsucceed()", setup="from __main__ import chgtmostsucceed")) print(timeit.timeit("chnemostsucceed()", setup="from __main__ import chnemostsucceed")) print(timeit.timeit("chnemostfail()", setup="from __main__ import chnemostfail")) |
这是你的计划的瓶颈吗?只有答案是肯定的,你才会担心。此外,没有任何东西可以说在任何操作系统或任何类型中都可以更快。
为了好玩,我定时while循环:
1 2 3 4 5 6 7 8 9 10 11 | #!/usr/bin/python import time a = 1000000 t0 = time.time() while(a != 0): a = a - 1 t1 = time.time() total = t1-t0 print total |
和:
0.12652015686
0.111998081207
对于计时,请检查:我如何计算代码段以使用Pythons timeit测试性能?
但是,使用timeit,正如Martijn Pieters建议的那样(在Python 2.7中获取执行代码块的时间),如下所示:
1 2 3 4 5 6 7 8 9 | #!/usr/bin/python import timeit a = 1000000 start_time = timeit.default_timer() while(a != 0): a = a - 1 elapsed = timeit.default_timer() - start_time print elapsed |
给了
0.10852098465
对于
0.108459949493
看两种时序方法的不同之处!