python-3.x - 使校验和功能更快
问题描述
这个校验和计算会被调用很多次:是否可以让下面的校验和函数工作得更快?
我特别想知道是否有可能摆脱 for 循环(据我所知,这些循环在 python 中很慢)。
sred = b'Standa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x008MR191-28'\
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
b'\x00\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc'\
b'\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xe9\xa8'
def _check_crc(bstring):
crc = 0xffff
for b in bstring:
crc = crc ^ b
for i in range(8):
carry_flag = crc & 0x0001
crc = crc >> 1
if carry_flag == 1:
crc = crc ^ 0xa001
return crc
_check_crc(sred) # will give 0
解决方案
这段代码在我的机器上快了大约 10%:
def _check_crc(bstring):
crc = 0xffff
for b in bstring:
crc = crc ^ b
for i in range(8):
if crc & 0x0001:
crc = (crc >> 1) ^ 0xa001
else:
crc = crc >> 1
return crc
这主要是由于消除了对 的分配carry_flag
。布尔比较if crc & 0x0001:
也可能比比较 vs. 1 快一点。
可能还有其他可能的改进,但我现在唯一的进一步想法是尝试在 C 中实现该函数。但是,我不知道这会快多少。按位运算应该已经非常快了。