首页 > 解决方案 > 在 Python 中高效读取二进制文件

问题描述

我对 Python 还很陌生;我有一个脚本,它一次读取一个字节的二进制文件,我正在寻求改善执行时间。我假设从 I/O 的角度来看这是非常低效的:

With InputFile:    
    InByte = InputFile.read(1)
    while InByte != b'':
        # Do stuff
        InByte = InputFile.read(1)

我在想读取更大的数据块(例如读取(1000000000))然后通过迭代会更有效。使用我的 C 头,这将是一个大堆区域和一个 char 指针,当缓冲区耗尽时,重置指针并将另一个块加载到缓冲区中。遍历字符串是一种选择,但在某些时候,我想处理多个字节,然后将指针向前跳转该数量,我认为字符串迭代器不可能做到这一点。

有没有在 Python 中进行这种处理的有效方法,或者,由于速度很重要,我最好只使用 C 吗?对于上下文,我正在尝试确定文件的编码 - 类似于 Linux“文件”命令,但收集更详细的指标。

编辑: 因此实现了缓冲读取(代码简化):

With InputFile:    
    InString = InputFile.read(BufferSize)
    
    while ChunksToProcess:
        for InByte in InString:
            # Do stuff
         
        InString = InputFile.read(BufferSize)

我通过一个 1 字节的缓冲区运行了一个大文件,并获得了 305,836 B/s 的处理速率。使用 10,000 字节的缓冲区运行时,我得到了 346,950 B/s。任何大于 10,000 的缓冲区大小都具有相同的吞吐量。10,000 似乎也是显示出任何改进的最大尺寸。

我对此感到惊讶,因为我认为处理将受 I/O 限制,但它似乎受处理器限制。我认为我现在的选择是看看我是否可以多线程处理“Do stuff”(这很困难,因为这可能会拆分相关的字节组)或求助于诸如 C 之类的编译语言。

标签: pythonfilebinaryiteration

解决方案


推荐阅读