python - 在 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 之类的编译语言。
解决方案
推荐阅读
- asp.net-core - 如果在发布文件夹外执行 dotnet,dotnet 不会加载 appsettings.json
- typescript - 删除`··`,替换`············` 为`······` eslint() eslintprettier/prettier
- google-cloud-run - Cloud Run HTTP2 破坏了 CORS
- npm - npm 7 - 为什么在对 install 命令进行了所有改进之后我们还需要 ci 命令?
- c - 复制缓冲区并返回指向下一个可用元素的指针的最佳方法是什么?
- javascript - 如何使用 ref 访问和销毁画布?
- database - 我们可以包含存储在数据库中的 html 内容的部分视图#laravel
- javascript - 如何将一个div附加到另一个div中?
- sql - 删除 Snowflake 中的列注释
- python - SQLAlchemy AttributeError:“AsyncEngine”对象没有属性“_run_ddl_visitor”