我有一个 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(使用前将#替换为@)