检查uint16是否在范围内的最快方法,包括溢出包装

时间:2018-08-22 12:21:12

标签: python python-3.x

我的取值范围是0到65535(如uint16)。如果值超出边界f,则它们会回绕。 e。 65535 +1 =0。

检查数字x是否在给定范围(y,y + 20)中的最快方法是什么? xy在值范围内,但是y+20可以包装。例如,当x = 2y = 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。

1 个答案:

答案 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