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 位小端压缩数据的快速方法的主要内容,如果未能解决你的问题,请参考以下文章

如何从 zip 文件中读取数据而无需解压缩整个文件

当程序写入/读取文件时,如何透明地压缩/解压缩文件?

java 解压缩之后文件内容读取

python怎样压缩和解压缩ZIP文件

Python:将二进制文件解压缩成二维数组并给出长度错误

Java - 读取 BZ2 文件并即时解压缩/解析