在 Python 中按字节读取二进制文件的最快方法
The fastest way to read binary files by bytes in Python
我正在制作一个程序,它应该能够使用哈夫曼算法对任何类型的文件进行编码。一切正常,但是在大文件上使用它太慢了(至少我认为是这样)。当我试图打开一个 120MB 的 mp4 文件来解压缩它时,我花了大约 210 秒来读取文件。更不用说这样做需要大量内存。我认为使用 struct 解包会很有效,但事实并非如此。在 python 中没有更有效的方法吗?我需要按字节读取任何文件,然后将其传递给字符串中的 huffman 方法。
if __name__ == "__main__":
start = time.time()
with open('D:\mov.mp4', 'rb') as f:
dataL = f.read()
data = np.zeros(len(dataL), 'uint8')
for i in range(0, len(dataL)):
data[i] = struct.unpack('B', dataL[i])[0]
data.tostring()
end = time.time()
print("Original file read: ")
print end - start
encoded, table = huffman_encode(data)
您的方法是将文件加载到 python 对象中 -> 创建一个空的 Numpy 数组,然后使用 Python 迭代器一点一点地填充 Numpy 数组。
让我们去掉中间商:
if __name__ == "__main__":
start = time.time()
data = np.fromfile('d:\mov.mp4', dtype=np.uint8, count=-1)
end = time.time()
print("Original file read: ")
print end - start
encoded, table = huffman_encode(data)
如何处理 'data' 取决于您的 huffman_encode(data) 将接收的数据类型。我会尽量避免使用字符串。
关于通话的文档在这里:http://docs.scipy.org/doc/numpy/reference/generated/numpy.fromfile.html
- 我很想听听评论中的速度差异:)
我正在制作一个程序,它应该能够使用哈夫曼算法对任何类型的文件进行编码。一切正常,但是在大文件上使用它太慢了(至少我认为是这样)。当我试图打开一个 120MB 的 mp4 文件来解压缩它时,我花了大约 210 秒来读取文件。更不用说这样做需要大量内存。我认为使用 struct 解包会很有效,但事实并非如此。在 python 中没有更有效的方法吗?我需要按字节读取任何文件,然后将其传递给字符串中的 huffman 方法。
if __name__ == "__main__":
start = time.time()
with open('D:\mov.mp4', 'rb') as f:
dataL = f.read()
data = np.zeros(len(dataL), 'uint8')
for i in range(0, len(dataL)):
data[i] = struct.unpack('B', dataL[i])[0]
data.tostring()
end = time.time()
print("Original file read: ")
print end - start
encoded, table = huffman_encode(data)
您的方法是将文件加载到 python 对象中 -> 创建一个空的 Numpy 数组,然后使用 Python 迭代器一点一点地填充 Numpy 数组。
让我们去掉中间商:
if __name__ == "__main__":
start = time.time()
data = np.fromfile('d:\mov.mp4', dtype=np.uint8, count=-1)
end = time.time()
print("Original file read: ")
print end - start
encoded, table = huffman_encode(data)
如何处理 'data' 取决于您的 huffman_encode(data) 将接收的数据类型。我会尽量避免使用字符串。
关于通话的文档在这里:http://docs.scipy.org/doc/numpy/reference/generated/numpy.fromfile.html
- 我很想听听评论中的速度差异:)