python 二进制文件处理耗时较长

4uqofj5v  于 2022-12-21  发布在  Python
关注(0)|答案(1)|浏览(170)

我有一个十六进制字节的二进制文件,只有15 MB,用下面的代码处理需要很长时间。我将数据导入到一个列表中,并一次运行一帧(50字节)数据。我想知道是否有一些改进可以减少处理时间?

with open(r'C:\binary_file.bin', 'rb') as p:
    my_bytes = p.read()

data= list(my_bytes)

frame = 50
sample = 0
processed = []

scales = [
    0.0625, 
    0.0625,
    0.00390625,
    0.00390625,
    3.05176e-05,
    1.0,
    1.0,
    1.0,
    1.0,
    1.0,
    1.0,
    1.0,
    0.0078125,
    0.001953125,
    0.0001220703,
    0.0001220703,
    0.0001220703,
    3.05176e-05,
    1.0,
    0.0001220703,
    0.001953125,
    1.0,
    1.0,
    1.0
]

while len(data) >= frame:
    temp1 = [data[i] + data[i + 1] * 256 for i in range(0, frame - 10, 2)]
    temp2 = [i - 65536 if i > 32767 else i for i in temp1]
    temp3 = [
        int(a * b) if (b == 1 or b == 2) else a * b
        for a, b in zip(temp2, scales)
    ]
    temp3 = [round(i, 5) for i in temp3]
    temp3.insert(0, sample)
    sample += 1
    processed += [temp3]
    del data[:frame]
b4wnujal

b4wnujal1#

你把整个文件读入一个列表。然后从列表的前面一次删除{frame}个字节。这样做可能会花很长时间。试着删除所有其他“处理”数据的代码,只留下读取文件和获取下一帧的代码,包括有问题的那一行

del data[:frame]

你会注意到,我怀疑,这需要同样长的时间,因为从列表的前面删除是一个非常昂贵的过程,你会在一个非常大的列表上一遍又一遍地做,没有任何原因。
如果只是推进帧,而不修改保存帧的数据结构,那么您的程序将花费几秒钟的时间,我使用https://stackoverflow.com/a/312464/1766544处理几MB的文件大约花费了8秒钟
但是我们可以做得更好。将整个文件读入内存是不必要的,因为你一次只使用一帧。你有一个文件句柄--让操作系统来做它的工作。现在你的数据只是保存了你想让它处理的数据的大小。

done = False
with open(filename, 'rb') as p:
    while not done:
        my_bytes = p.read(frame)
        done = process_frame(my_bytes)

这对我来说几乎是瞬间完成的,在我的系统上任意一个14 MB的文件上运行您的完整代码。

相关问题