首页 > 解决方案 > 使校验和功能更快

问题描述

这个校验和计算会被调用很多次:是否可以让下面的校验和函数工作得更快?

我特别想知道是否有可能摆脱 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

标签: python-3.xoptimizationchecksum

解决方案


这段代码在我的机器上快了大约 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 中实现该函数。但是,我不知道这会快多少。按位运算应该已经非常快了。


推荐阅读