我有一个十六进制字节的二进制文件,只有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]
1条答案
按热度按时间b4wnujal1#
你把整个文件读入一个列表。然后从列表的前面一次删除{frame}个字节。这样做可能会花很长时间。试着删除所有其他“处理”数据的代码,只留下读取文件和获取下一帧的代码,包括有问题的那一行
你会注意到,我怀疑,这需要同样长的时间,因为从列表的前面删除是一个非常昂贵的过程,你会在一个非常大的列表上一遍又一遍地做,没有任何原因。
如果只是推进帧,而不修改保存帧的数据结构,那么您的程序将花费几秒钟的时间,我使用https://stackoverflow.com/a/312464/1766544处理几MB的文件大约花费了8秒钟
但是我们可以做得更好。将整个文件读入内存是不必要的,因为你一次只使用一帧。你有一个文件句柄--让操作系统来做它的工作。现在你的数据只是保存了你想让它处理的数据的大小。
这对我来说几乎是瞬间完成的,在我的系统上任意一个14 MB的文件上运行您的完整代码。