繁体   English   中英

在python中解析(拆分)二进制位的最快方法

[英]Fastest way to parse (split) binary bits in python

我们正在使用此FPGA计数器对光子进行计数并进行时间标记 每分钟大约有500MB的数据。 我正在获取十六进制字符串中的 32位数据* 使用little-endian字节顺序存储的32位有符号整数。 目前我正在做的像:

def getall(file):
    data1 = np.memmap(file, dtype='<i4', mode='r')

    d0=0
    raw_counts=[]
    for i in data1:

        binary = bin(i)[2:].zfill(8)
        decimal = int(binary[5:],2)

        if binary[:1] == '1':
            raw_counts.append(decimal)

    counter=collections.Counter(raw_counts)
    sorted_counts=sorted(counter.items(), key=lambda pair: pair[0], reverse=False)
    return counter,counter.keys(),counter.values()

我认为这部分( binary = bin(i)[2:].zfill(8);decimal = int(binary[5:],2) )正在减慢该过程。 (不,不是。我是通过对程序进行概要分析发现的。)有什么方法可以加快它的速度吗? 到目前为止,我只需要[5:]中的二进制位。 我不需要所有的32位。 因此,我认为将32位解析为最后27位会花费很多时间。 谢谢,

*更新1

JFSebastian指出了它不是十六进制字符串。

*更新2

如果有人需要,这里是最终代码。 我最终使用np.unique而不是收集计数器。 最后,由于要进行累计计数,我转换回了收款柜台。

#http://stackoverflow.com/questions/10741346/numpy-most-efficient-frequency-counts-for-unique-values-in-an-array
def myc(x):
    unique, counts = np.unique(x, return_counts=True)
    return np.asarray((unique, counts)).T


def getallfast(file):
    data1 = np.memmap(file, dtype='<i4', mode='r')
    data2=data1[np.nonzero((~data1 & (31 <<1)))] & 0x7ffffff #See J.F.Sebastian's comment.
    counter=myc(data2)
    raw_counts=dict(zip(counter[:,0],counter[:,1]))
    counter=collections.Counter(raw_counts)

    return counter,counter.keys(),counter.values()

但是,对于我来说,这似乎是最快的版本。 data1[np.nonzero((~data1 & (31 <<1)))] & 0x7ffffff与先计数相比变慢,以后再转换数据binary = bin(counter[i,0])[2:].zfill(8)

def myc(x):
    unique, counts = np.unique(x, return_counts=True)
    return np.asarray((unique, counts)).T

def getallfast(file):
    data1 = np.memmap(file, dtype='<i4', mode='r')
    counter=myc(data1)
    xnew=[]
    ynew=[]
    raw_counts=dict()
    for i in range(len(counter)):
        binary = bin(counter[i,0])[2:].zfill(8)
        decimal = int(binary[5:],2)
        xnew.append(decimal)
        ynew.append(counter[i,1])
        raw_counts[decimal]=counter[i,1]


    counter=collections.Counter(raw_counts)
    return counter,xnew,ynew

我想您可以尝试以下两种方法之一

可以只取二进制和fivebits=my_int&0x1f

如果您想要另一端的五位,仅fivebits = my_int >> (32-5)

但是根据我的经验,将其转换为字符串确实非常快...很多年前,我认为这是一个瓶颈...在对其进行概要分析后,我发现它不是

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM