我正在开发一个实时应用程序,我必须尽快处理一行数据,然后将其发送到应用程序。这些线路以非常快的速度到达,大约每分钟40k。任务是从行中的hexa数据中提取某些单独位的值。我已经有了一个解决方案,但我怀疑它是最有效的解决方案,所以我问你是否可以改进它。
数据样本系列:
p1 p2 p3 len data
1497383697 0120 000 5 00 30 63 4f 15
len 是数据中的字节数,数据是我们正在使用的。让我们说我想从左边第11位开始提取3位。使用填充将hexa转换为二进制:
0x0030634f15 = 0000 0000 00 11 0 000 0110 0011 0100 1111 0001 0101
想要的值是0b110,十进制是6。
我解决问题的方法是:
# 11 and 3 in the example
start = config.getint(p, 'start')
length = config.getint(p, 'length')
parts = line.split()
hexadata = ''.join(parts[4:])
bindata = bin(int(hexadata, 16))[2:].zfill(len(hexadata) * 4)
val = int(bindata[start:start + length], 2)
val 最后会保留值6。还有其他更有效的方法吗?谢谢
答案 0 :(得分:2)
不是使用字符串操作,而是将输入转换为数字并使用位操作更快:
parts = line.split(maxsplit=4)
# remove spaces in the number and convert it to int from base 16
num = int(parts[4].replace(' ', ''), 16)
# create a bit mask with exactly `length` 1s
mask = (1 << length) - 1
# calculate the offset from the right
shift = 40 - start - length
# shift the value to the right and apply the binary mask to get our value
val = (num >> shift) & mask
根据我的时间,位操作速度提高了约20%。时间结果有100万次迭代:
string_ops 2.735653492003621 seconds
bit_ops 2.190693126998667 seconds