我得到了一个从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.558s,test2为1.071s。你知道吗
您的第一个测试是非常低效的,因为您正在生成一个包含整数负载的列表(填充内存的一部分),然后遍历整个列表以查找其中是否有一个整数,而您可以使用数字测试来检查该数字是否在该范围内。你知道吗
因此,这就解释了为什么第二个测试在完成时要快得多,但在某些情况下会产生错误的结果,因为您应该添加
2**16
而不是2**16-1
,因为无符号系统是mod2**16
(65536
)而不是65535
!你知道吗哦,还有一些一般的Python技巧。您可以只返回
num in
rin
test1(scrap the if-statement) and same in
test`,您可以只返回条件。从效率上看,这基本上没有影响,但从文体上来说,说“如果这句话是真的,那么这句话是真的,否则这句话是假的”就等同于说“如果这句话”。你知道吗最后,我同意:
应该是这样的:
相关问题 更多 >
编程相关推荐