我的取值范围是0到65535(如uint16)。如果值超出边界f,则它们会回绕。 e。 65535 +1 =0。
检查数字x是否在给定范围(y,y + 20)中的最快方法是什么? x
和y
在值范围内,但是y+20
可以包装。例如,当x = 2
和y = 65533
时,返回值应为True
。
我正在使用Python3,并尝试避免导入任何模块。我已经知道了:
def test1(num, min):
r = [x % 2**16-1 for x in range(min, min+20)]
if num in r:
return True
return False
def test2(num, min):
return True if min <= num < min+20 or min <= num+2**16-1 < min+20 else False
timeit
(一百万次执行)报告test1为7.558 s,test2报告为1.071 s。
答案 0 :(得分:3)
您的第一个测试效率很低,因为您正在生成带有整数负载的列表(填充内存的一部分),然后遍历整个列表只是为了查找其中是否有一个整数,当您可以使用数值测试来检查该数字是否在该范围内。
因此,这说明了为什么您的第二项测试可以更快地完成,但是在某些情况下它会产生错误的结果,因为您应该添加2**16
而不是2**16-1
,因为未签名的系统是mod {{1} }(2**16
而非65536
!
哦,还有一些Python技巧。您可能刚刚返回了65535
r num in
test1 in
test`,则可以返回条件。从效率的角度来看,这基本上没有影响,但是从风格上讲,“如果此语句为真,否则为假”表示等同于仅“如果此语句”。
最后,我会同意:
(scrap the if-statement) and same in
应能正常工作:
def test(num, min):
return min <= num < min+20 or min <= num+2**16 < min+20