python read() 从 stdout 比逐行读取慢得多(啜饮?)

2024-01-31

我有一个 python SubProcess 调用,它运行一个可执行文件并将输出通过管道传输到我的子进程标准输出。

在 stdout 数据相对较小(约 2k 行)的情况下,逐行读取和作为块读取 (stdout.read()) 之间的性能相当......其中 stdout.read() 稍快一些。

一旦数据变得更大(比如 30k+ 行),逐行读取的性能就会明显更好。

这是我的比较脚本:

proc=subprocess.Popen(executable,stdout=subprocess.PIPE)
tic=time.clock()
for line in (iter(proc.stdout.readline,b'')):
    tmp.append(line)
print("line by line = %.2f"%(time.clock()-tic))

proc=subprocess.Popen(executable,stdout=subprocess.PIPE)
tic=time.clock()
fullFile=proc.stdout.read()
print("slurped = %.2f"%(time.clock()-tic))

这些是读取约 96k 行(或 50MB 磁盘内存)的结果:

line by line = 5.48
slurped = 153.03

我不清楚为什么性能差异如此之大。我的期望是 read() 版本应该比逐行存储结果更快。当然,在实际情况下,我期望在读取过程中可以完成大量的每行处理,从而获得更快的逐行结果。

谁能让我深入了解 read() 性能成本?


这不仅仅是Python,在没有缓冲的情况下按字符读取总是比读入行或大块慢。

考虑这两个简单的 C 程序:

[readchars.c]

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

int main(void) {
        FILE* fh = fopen("largefile.txt", "r");
        if (fh == NULL) {
                perror("Failed to open file largefile.txt");
                exit(1);
        }

        int c;
        c = fgetc(fh);
        while (c != EOF) {
                c = fgetc(fh);
        }

        return 0;
}

[readlines.c]

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

int main(void) {
        FILE* fh = fopen("largefile.txt", "r");
        if (fh == NULL) {
                perror("Failed to open file largefile.txt");
                exit(1);
        }

        char* s = (char*) malloc(120);
        s = fgets(s, 120, fh);
        while ((s != NULL) && !feof(fh)) {
                s = fgets(s, 120, fh);
        }

        free(s);

        return 0;
}

他们的结果(YMMW,largefile.txt 约为 200MB 文本文件):

$ gcc readchars.c -o readchars
$ time ./readchars            
./readchars  1.32s user 0.03s system 99% cpu 1.350 total
$ gcc readlines.c -o readlines
$ time ./readlines            
./readlines  0.27s user 0.03s system 99% cpu 0.300 total
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python read() 从 stdout 比逐行读取慢得多(啜饮?) 的相关文章

随机推荐

  • 如何让 Unity 3D 中的对象保留在场景中并且不会重新创建

    我正在尝试找到一种在 Unity 3D 中播放背景音乐的好方法 我希望音乐在场景加载中保持一致播放 加载时不要破坏很好并且有效 但是每次我加载同一个场景时 它都会生成另一个音乐游戏对象 因为场景本身包含游戏对象 我该如何解决我的问题 我是一
  • aspx 和 aspx.cs 文件之间的链接断开

    在重命名不同的 ASPX 页面后 我曾多次遇到同样的问题 令我惊讶的是我在 stackoverflow 上找不到其他人也有同样的问题 当我运行 ASP NET C 项目时 调试器会向我显示一条类似这样的消息 Error 5 The name
  • 使用scrapy提取XHR请求?

    我正在尝试抓取使用 javascript 生成的社交点赞计数 如果我绝对引用 XHR url 我就能够抓取所需的数据 但是我尝试抓取的网站动态生成这些 XMLHttpRequest 其中包含我不知道如何提取的查询字符串参数 例如 您可以看到
  • 具有更新队列和输出队列的 Python 多处理

    如何编写使用两个队列的 Python 多进程脚本 一个作为工作队列 以一些数据开始 并且根据要并行化的函数的条件 动态接收更多任务 另一个收集结果并用于在处理完成后写下结果 我基本上需要根据我在初始项目中发现的内容在工作队列中放入更多任务
  • C中使用的括号及其用途

    如果之前有人问过这个问题 我很抱歉 但我是 C 的初学者 我想知道是否有人可以帮助解释一下 下面的代码中的括号 我从在线教程中获取了它 它运行得很好 但有一部分我不明白 include
  • SingleProducerConstrained 和 MaxDegreeOfParallelism

    在 C TPL 数据流库中 SingleProducerConstrained 是 ActionBlocks 的优化选项 当只有单个线程提供操作块时可以使用 如果一个区块只会被一个生产者在某个时间点使用 time 这意味着一次只有一个线程会
  • iText:PdfTable单元格垂直对齐

    我正在尝试将标题单元格文本垂直对齐到单元格高度的中间 这是我的代码 PdfPCell c1 new PdfPCell cerate phrase regular bold c1 setHorizontalAlignment Element
  • Open GL 对于 2d 卡牌游戏来说太过分了吗?

    我只是有一个创建纸牌游戏的想法 我只是在考虑是否使用 OpenGl 还是 CoreAnimation 你能告诉我使用 OpenGL 来制作 2D 纸牌游戏是否有点过分了 谢谢 在不了解更多情况的情况下很难说 不过 您可以使用 CALayer
  • 使用 Python 客户端 API 在 Google Cloud Pub/Sub 中运行同步拉取

    我找不到立即返回Python 客户端 API 中的标志 有什么具体原因吗 是否有另一种方法可以从 Python 中的订阅中同步提取排队消息 谷歌不提供这样的东西 但是您可以通过实现自己的队列轻松解决这个问题 from Queue impor
  • Nuxt js - SSR页面重复组件

    我正在生成一个带有组件列表的简单静态页面 当我从另一个页面访问该页面时 它会正确呈现所有内容 当我直接登陆页面时 某些组件会在页脚之后再次呈现 如果我检查该元素 我可以看到它们是相同的元素 但在页脚之后再次呈现 任何人都知道为什么会发生这种
  • 仅保存 Outlook 邮件项目的真实附件

    我目前正在开发一个 Outlook 插件 它将邮件项目和附件保存在我的 MSSQL 数据库中 我有一个方法可以保存 MailItem 及其所有附件 但是 如果我保存所有附件 则 MailItem 中的嵌入图像也会保存 有谁知道如何拯救所有r
  • 使用JPA2时如何对EJB进行单元测试?

    您将如何对使用 JPA 的 EJB 进行单元测试 例如 如果我有一个 Order 实体和 OrderEJB 它应该计算订单总数 如下定义 我将如何在不接触数据库的情况下对 EJB 进行单元测试 另外 您将如何定义实体的值 以便可以断言预期的
  • 如何在 MPMoviePlayerController 中显示字幕

    我构建了一个自定义视频播放器 所有按钮都可以使用 我需要知道当视频具有该选项时 MPMoviePlayerController 显示字幕的代码是什么 我没有在任何地方找到示例或知道该字幕按钮背后的代码的人 我在哪里可以找到这个 您将必须实现
  • Eclipse 找不到我的 Android 4.1.2 设备

    我正在尝试仅运行介绍 Hello World 我的手机 Droid Razr Maxx 上的应用程序正在使用 Eclipse 运行 android 4 1 2 jelly bean 我启用了 USB 调试 尝试更新手机驱动程序 重新安装驱动
  • 如何在 Python (2.6) 中将 JSON 解码为 str 而不是 unicode? [复制]

    这个问题在这里已经有答案了 我有一个 JSON 格式的配置文件 其中包含一些字符串变量 始终为 ascii 这些字符串默认解码为 un icode 但由于我必须将这些变量传递给我的 Python C 扩展 所以我需要它们作为普通的 Pyth
  • 我可以在 Javascript 中抛出异常来停止 Javascript 执行吗?

    我尝试模拟一个问题 从外部 url 加载的脚本会停止执行我的网站上的任何其他脚本 我尝试通过调用不退出的函数来模拟这样的问题 我可以在 firebug 中看到错误 但页面上的不同脚本仍然执行 JavaScript 中是否存在不同类型的错误
  • 8086 汇编中的大二进制移位?

    我有一个 512 字节长的二进制数据块 我想知道如果我想将其右移一次 最有效的方法是什么 我现在最好的猜测 对于汇编来说非常新 是我必须首先检查一个块 可能是 int 看看它将移出什么 移出 然后携带先前 int 移出的任何内容并继续携带这
  • Java:如何计算从InputStream读取的字节数而不事先分配完整内存

    我有一个 Java 后端 用户可以将文件上传到其中 我想将这些上传的文件限制为最大大小 并希望在上传时检查上传的字节数 并在达到限制后立即中断传输 目前 我在分配之前使用 InputStream available 来确定估计大小 但这似乎
  • 在 Elixir 中引用管道值

    我想计算字符串中单词出现的次数 实现是有问题的 但让我们用它来演示我的问题 def count sentence do words String split sentence occurrences Enum map words fn w
  • python read() 从 stdout 比逐行读取慢得多(啜饮?)

    我有一个 python SubProcess 调用 它运行一个可执行文件并将输出通过管道传输到我的子进程标准输出 在 stdout 数据相对较小 约 2k 行 的情况下 逐行读取和作为块读取 stdout read 之间的性能相当 其中 s