我有这个清单
bytes = ['11010001', '00100111']
我想将bytes
的内容写在我自己的二进制文件中作为一个字节。因此,我遍历列表的每个元素,将其从字符串转换为二进制,然后将其作为由该二进制组合表示的char在文件中写入。
output = open(location+filename + '.enchuff', 'wb')
for byte in bytes:
chunk = int(byte, base=2)
output.write(chr(chunk))
效果很好,但问题是当bytes
列表变大时。我从另一个文件生成它,当我输入时,让我们说一个100MB的文件让它读取,列表真的很长,我的程序在for循环中挂起。我想for循环一定是问题,因为它可能会迭代超过数十万个元素并写下它们中的每一个元素。此外,我的记忆消耗从那一点甚至跃升到4GB的内存。有没有其他方法可以更快地实现这一目标并保留珍贵的RAM?
答案 0 :(得分:1)
您的代码可能效率低下,因为您正在为流中的每个字节执行写操作。虽然写入可能是缓冲的,但这种情况发生在较低级别,每次迭代会产生大量开销。
您可以在内存中转换字节流,然后将其写入流,例如:
data = [chr(int(x, base=2)) for x in bytes]
output.write(''.join(data))
如果内存消耗是个问题,你可以用块来编写转换的字节,例如:
chunksize = 1024
for c in range(0,len(bytes),chunksize):
data = [chr(int(x, base=2)) for x in bytes[c:c+chunksize]]
output.write(''.join(data))