Python:读取/解压缩 12 位小端压缩数据的快速方法
Posted
技术标签:
【中文标题】Python:读取/解压缩 12 位小端压缩数据的快速方法【英文标题】:Python: Fast way to read/unpack 12 bit little endian packed data 【发布时间】:2021-01-22 18:48:59 【问题描述】:如何在 Python 中加快读取 12 位 little endian 打包数据的速度?
以下代码基于https://***.com/a/37798391/11687201,可以运行,但耗时太长。
import bitstring
import numpy as np
# byte_string read from file contains 12 bit little endian packed image data
# b'\xAB\xCD\xEF' -> pixel 1 = 0x0DAB, pixel 2 = Ox0EFC
# width, height equals image with height read
image = np.empty(width*height, np.uint16)
ic = 0
ii = np.empty(width*height, np.uint16)
for oo in range(0,len(byte_string)-2,3):
aa = bitstring.BitString(byte_string[oo:oo+3])
aa.byteswap()
ii[ic+1], ii[ic] = aa.unpack('uint:12,uint:12')
ic=ic+2
【问题讨论】:
【参考方案1】:这应该会更好一些:
for oo in range(0,len(byte_string)-2,3):
(word,) = struct.unpack('<L', byte_string[oo:oo+3] + b'\x00')
ii[ic+1], ii[ic] = (word >> 12) & 0xfff, word & 0xfff
ic += 2
它非常相似,但不是使用很慢的bitstring
,而是使用对struct.unpack
的一次调用来一次提取24位(用零填充,以便可以将其读取为long)和然后进行一些位掩码以提取两个不同的 12 位部分。
【讨论】:
非常感谢。您的解决方案大大加快了代码执行速度。以前需要 2 分钟,现在需要 2 秒。 我找到了一个比这个运行速度更快的解决方案。我使用了您解决方案的某些方面。我在下面添加了我现在正在使用的新解决方案:***.com/a/65952153/11687201 运行得更快,。【参考方案2】:我找到了一个解决方案,它在我的系统上的执行速度比上面提到的解决方案 https://***.com/a/65851364/11687201 快得多,这已经是一个很大的改进(使用问题中的代码需要 2 秒而不是 2 分钟)。 使用下面的代码加载我的一个图像文件大约需要 45 毫秒,而不是上述解决方案大约需要 2 秒。
import numpy as np
import math
image = np.frombuffer(byte_string, np.uint8)
num_bytes = math.ceil((width*height)*1.5)
num_3b = math.ceil(num_bytes / 3)
last = num_3b * 3
image = image[:last]
image = image.reshape(-1,3)
image = np.hstack( (image, np.zeros((image.shape[0],1), dtype=np.uint8)) )
image.dtype='<u4' # 'u' for unsigned int
image = np.hstack( (image, np.zeros((image.shape[0],1), dtype=np.uint8)) )
image[:,1] = (image[:,0] >> 12) & 0xfff
image[:,0] = image[:,0] & 0xfff
image = image.astype(np.uint16)
image = image.reshape(height, width)
【讨论】:
以上是关于Python:读取/解压缩 12 位小端压缩数据的快速方法的主要内容,如果未能解决你的问题,请参考以下文章