哪种测试更快:平等还是不平等?
例如,在一个较大的while
循环中,条件应该是a>0
而不是a!=0
吗?
答案 0 :(得分:8)
当问自己一个关于不同运营商之间速度差异的问题时,请使用timeit
module 衡量。他们同样快:
>>> 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万次,如果你重新进行上述测试,你会发现时间可能有所不同,没有一个是明显的赢家。
你应该专注于可读性,而不是速度。简单的整数比较将成为整体执行速度的 infinitesimal 部分,即使在循环中也是如此。
答案 1 :(得分:5)
如果我们谈论a
是int
,那么此时我的机器上的等式检查非常轻微比大于校验。您可以使用timeit
module快速检查自己:
>>> 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
然而,这些数字非常接近另一个。所以你应该从这个答案中选择一件事:没关系。
这些东西都是微观优化。微优化很少会对应用程序的实际性能产生任何影响。应用程序中有数千个其他部分更有可能对性能产生更大影响,使这种差异可以忽略不计。如果您实际profiled your application并且确认代码的这一部分是导致应用程序性能下降的瓶颈,那么您应该只关心这些事情。但是对于这个特殊的代码,我怀疑情况会是如此。
所以请不要理会这些微小的差异但只是使用更有意义的东西:考虑到这两个检查具有不同的语义含义(数字不等于零或数字)如果大于零,请选择您实际要检查的那个。
答案 2 :(得分:1)
对我而言,timeit
并未显示任何明显的差异(假设您正在使用整数)...
>>> timeit.timeit('1 > 0')
0.031796932220458984
>>> timeit.timeit('1 != 0')
0.03249096870422363
>>> timeit.timeit('1 > 0')
0.03250718116760254
>>> timeit.timeit('1 != 0')
0.031616926193237305
正如关于这个问题的评论所述,不应该关注哪个算子最快,你应该专注于最有意义的算子。如果你的意思是"在a
大于0
"而不是使用>
。进行这种比较所花费的时间对于整个运行时来说将是一个非常小的贡献因素,因此可能不值得担心哪个运算符更快...
答案 3 :(得分:0)
这是您的计划的瓶颈吗? 只有答案是肯定的,您才会担心。此外,没有任何内容表明在任何操作系统或任何类型的操作中都能确保更快。
为了好玩,我定时了while循环:
#!/usr/bin/python
import time
a = 1000000
t0 = time.time()
while(a != 0):
a = a - 1
t1 = time.time()
total = t1-t0
print total
和
a > 0
给出:
0.12652015686
a != 0
给出:
0.111998081207
有关时间安排,请查看:How can I time a code segment for testing performance with Pythons timeit?
但是,使用timeit,正如Martijn Pieters建议的那样(Get time of execution of a block of code in Python 2.7),如下所示:
#!/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
给了a > 0
:
0.10852098465
和a != 0
:
0.108459949493
看两种时间方法的不同之处!
答案 4 :(得分:0)
我认为这个有点沉重的测试程序显示在字符和整数比较的情况下基本没有区别
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"))