【发布时间】:2014-01-27 16:42:14
【问题描述】:
我有一个 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() 的性能成本?
【问题讨论】:
-
子进程执行的时间总是一样吗? (例如,缓存对重复运行等没有影响)
-
重复运行没有观察到明显的收益。
-
无法使用
seq 30000(linux.die.net/man/1/seq) 进行复制。我认为我们将需要一个 SSCCE (sscce.org)。 -
我怀疑内存压力。您是否比较了两种情况下的内存使用模式?
-
@NPE:这是一个 Windows 系统……如果 python 执行与 linux python 有什么不同的话。另外,我不确定 seq 30000 会强制我看到的行为,因为我认为这是数据量问题,而不是行数问题。我的每一行都有大约 400 个字符。
标签: python performance subprocess readline