2016-06-15 92 views
2

python3程序是從其他地方接收數據如下面的格式的字符串(...意味着我關心鍵入更多的數據):高效逗號分隔值的字符串轉換爲字節

data = "0,12,145,234;1,0,0,128;2,255,255,255;...;909,100,100,100;" 

我想要將其轉換爲打包的二進制數據,我忽略了,;字符。目前,我做了以下內容:

splitData = data.split(';')[:-1] # ignore the last ';' 
buff = [] 
for item in splitData: 
    addr, R, G, B = item.split(',') 
    addr = int(addr) # two bytes 
    R = int(R) # one byte 
    G = int(G) # one byte 
    B = int(B) # one byte 
    packed = struct.pack('HBBB', addr, R, G, B) 
    buff.append(packed) 
dataBytes = b''.join(buff) 

對於我上面的示例數據,這個過程給了我以下:

dataBytes = b'\x00\x00\x0c\x91\xea\x01\x00\x00\x00\x80...\x8d\x03ddd' 

這就是我想要的(並且是關於一個規模第三原始字符串)。

但是,該過程需要約0.002秒。我需要每幀進行33次這個過程,這導致大約需要0.05秒來計算,總計約爲每秒20幀。如果可能,我想加快速度。

有沒有辦法將字符串數據轉換爲比上述方法快的字節數據?

回答

2

使用itertools,做了更換,然後分裂,映射到int終於在四肢荏苒是快約25%:

In [82]: data = "0,12,145,234;1,0,0,128;2,255,255,255;909,100,100,100;" * 1000 
In [83]: from itertools import imap, izip 
[84]: %%timeit 
splitData = data.split(';')[:-1] # ignore the last ';' 
buff = [] 
for item in splitData: 
    addr, R, G, B = item.split(',') 
    addr = int(addr) # two bytes 
    R = int(R) # one byte 
    G = int(G) # one byte 
    B = int(B) # one byte 
    packed = struct.pack('HBBB', addr, R, G, B) 
    buff.append(packed) 
dataBytes = b''.join(buff) 
    ....: 
100 loops, best of 3: 8.61 ms per loop 

In [85]: %%timeit  
mapped = imap(int, data[:-1].replace(";", ",").split(",")) 
b"".join([struct.pack('HBBB', *sub) for sub in izip(mapped, mapped, mapped, mapped)]) 
    ....: 
100 loops, best of 3: 6.27 ms per loop 

使用python3,只要使用地圖和郵政編碼:

In [4]: %%timeit 
mapped = map(int, data[:-1].replace(";", ",").split(",")) 
b"".join([struct.pack('HBBB', *sub) for sub in zip(mapped, mapped, mapped, mapped)]) 
    ...: 
100 loops, best of 3: 3.61 ms per loop 

In [5]: %%timeit   
splitData = data.split(';')[:-1] # ignore the last ';' 
buff = []                 for item in splitData: 
    addr, R, G, B = item.split(',') 
    addr = int(addr) # two bytes 
    R = int(R) # one byte 
    G = int(G) # one byte 
    B = int(B) # one byte 
    packed = struct.pack('HBBB', addr, R, G, B) 
    buff.append(packed) 
dataBytes = b''.join(buff) 
    ...: 
100 loops, best of 3: 4.89 ms per loop 
+1

超級聰明!起飛我的回答(+1) –

+1

這樣更快!我得到'0.00156'秒,而在我得到'0.00202'秒之前。 – wckronholm

相關問題