关于 Python 解析大端序文件效率问题的优化方案

我用 python 解析一个 5M 的大端序文件要 30s,实在优化不了了,就想尝试同时并行(现在是串行)处理多个这样的文件,有没有好的建议啊,谢谢🙏
关于 Python 解析大端序文件效率问题的优化方案

2 回复

帖子内容呢?没看到具体问题啊。是读二进制文件用struct.unpack('>I', data)太慢,还是用int.from_bytes(data, 'big')遇到瓶颈了?

通常来说,处理大端序二进制文件,最快的方法就是一次性读入内存,用memoryviewnumpy这类库来批量处理。如果文件太大,可以用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

回到顶部