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

2024-04-25 21:50:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到了一个从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.558s,test2为1.071s。你知道吗


Tags: 方法infalsetruereturnifdef数字
1条回答
网友
1楼 · 发布于 2024-04-25 21:50:00

您的第一个测试是非常低效的,因为您正在生成一个包含整数负载的列表(填充内存的一部分),然后遍历整个列表以查找其中是否有一个整数,而您可以使用数字测试来检查该数字是否在该范围内。你知道吗

因此,这就解释了为什么第二个测试在完成时要快得多,但在某些情况下会产生错误的结果,因为您应该添加2**16而不是2**16-1,因为无符号系统是mod 2**1665536)而不是65535!你知道吗

哦,还有一些一般的Python技巧。您可以只返回num inrintest1(scrap the if-statement) and same intest`,您可以只返回条件。从效率上看,这基本上没有影响,但从文体上来说,说“如果这句话是真的,那么这句话是真的,否则这句话是假的”就等同于说“如果这句话”。你知道吗

最后,我同意:

def test(num, min):
    return min <= num < min+20 or min <= num+2**16 < min+20

应该是这样的:

>>> test(32, 20)
True
>>> test(0, 65535)
True
>>> (65535 + 20) % 65536
19
>>> test(18, 65535)
True

相关问题 更多 >