用python解析大型二进制文件的最快方法

用python解析大型二进制文件的最快方法,python,parsing,binary,cython,mmap,Python,Parsing,Binary,Cython,Mmap,我有几十GB左右的文件,它们由10个左右的压缩C结构组成。我需要能够遍历文件中的每个结构进行分析,并希望能够用python代码进行分析。我根本不需要写入文件 我认为numpy在这里没有帮助,因为文件不仅仅是一个重复的结构。我发现struct.unpack太慢了 到目前为止,我的想法是使用Cython和mmap文件,然后迭代并将缓冲区强制转换为Cython C结构,以避免任何不必要的复制。但是,我在使用这种方法时遇到的障碍是,我不能直接使用Cython C结构指针,需要有效地编写python包装类

我有几十GB左右的文件,它们由10个左右的压缩C结构组成。我需要能够遍历文件中的每个结构进行分析,并希望能够用python代码进行分析。我根本不需要写入文件

我认为numpy在这里没有帮助,因为文件不仅仅是一个重复的结构。我发现struct.unpack太慢了

到目前为止,我的想法是使用Cython和mmap文件,然后迭代并将缓冲区强制转换为Cython C结构,以避免任何不必要的复制。但是,我在使用这种方法时遇到的障碍是,我不能直接使用Cython C结构指针,需要有效地编写python包装类,这会使编写工作变得有点慢和乏味。有人知道解决这个问题的方法吗


想知道是否还有其他可行的方法?我还没有考虑过ctypes。

你确定复制确实是问题所在吗?像这样的事情对你来说已经太慢了

st = struct.Struct('>QLB')  # whatever
while True:
    data = fp.read(st.size)
    if not data:
        break
    a, b, c = st.unpack(data)
    do_something_with(a, b, c)

如果是这样的话,也许使用mmap和
struct.unpack\u from
可以提高速度。

我实际上使用
struct.unpack
处理大型二进制文件,没有真正的速度问题。您是否尝试过使用
PyPy
?我认为,由于
struct.unpack
使用的是简单类型,它应该可以通过
PyPy
进行高度优化,因此它可能会给您所需的速度提升。@septi我的基本Cython实现需要2秒,而CPython中的struct.unpack需要76秒和pypypy 26秒