关于 Python 解析大端序文件效率问题的优化方案
我用 python 解析一个 5M 的大端序文件要 30s,实在优化不了了,就想尝试同时并行(现在是串行)处理多个这样的文件,有没有好的建议啊,谢谢🙏
关于 Python 解析大端序文件效率问题的优化方案
2 回复
帖子内容呢?没看到具体问题啊。是读二进制文件用struct.unpack('>I', data)太慢,还是用int.from_bytes(data, 'big')遇到瓶颈了?
通常来说,处理大端序二进制文件,最快的方法就是一次性读入内存,用memoryview或numpy这类库来批量处理。如果文件太大,可以用readinto到一个预分配的bytearray里循环处理。
比如要高效读取一个全是uint32大端序的文件,可以这样:
import struct
from pathlib import Path
def read_big_endian_ints_fast(file_path, chunk_size=1024*1024):
"""快速读取大端序uint32文件"""
format_str = '>I'
item_size = struct.calcsize(format_str)
with open(file_path, 'rb') as f:
# 预分配缓冲区
buffer = bytearray(chunk_size)
mv = memoryview(buffer)
while True:
# 读取一块数据
bytes_read = f.readinto(buffer)
if not bytes_read:
break
# 确保读取的是完整的数据项
complete_items = bytes_read // item_size
if complete_items:
data = mv[:complete_items * item_size]
yield from struct.unpack(f'>{complete_items}I', data)
# 处理可能的不完整尾部数据
if bytes_read % item_size:
# 将剩余字节移到缓冲区开头
remaining = buffer[complete_items * item_size:bytes_read]
buffer[:len(remaining)] = remaining
# 调整下次读取位置
f.seek(f.tell() - (bytes_read - complete_items * item_size))
关键是把多次小调用合并成批量操作,用memoryview避免复制。如果数据量极大,考虑用numpy.fromfile或者pandas.read_csv(指定dtype和engine)。
具体用哪种方案,得看你实际的数据结构和性能要求。
show us the codes

