stdin似乎比stdout(python)慢得多。为什么?

时间:2011-03-22 07:22:06

标签: python io stdio

我有两个需要相互通信的python程序(一个是子进程)。目前,我通过stdinstdout进行此操作。但是,写入子进程的stdin似乎非常缓慢。

a.py,一个采用任意输入行并打印时间的程序:

from time import time, sleep
from sys import stdout, stdin
while True:
    stdin.readline()
    stdout.write('%f\n' % time())
    stdout.flush()

b.py,一个运行a.py的程序,以及写入程序stdin所需的时间并从中读取stdout

from time import time
from subprocess import PIPE, Popen
from threading import Thread
stdin_times = []
stdout_times = []
p = Popen(['python', 'a.py'], stdin=PIPE, stdout=PIPE)
for i in range(100000):
    t1 = time()
    p.stdin.write(b'\n')
    p.stdin.flush()
    t2 = float(p.stdout.readline().strip().decode())
    t3 = time()
    stdin_times.append(t2 - t1)
    stdout_times.append(t3 - t2)
p.kill()
print('stdin (min/ave):', min(stdin_times), sum(stdin_times) / len(stdin_times))
print('stdout (min/ave):', min(stdout_times), sum(stdout_times) / len(stdout_times))

示例输出:

stdin (min/ave): 1.69277191162e-05 0.000138891274929
stdout (min/ave): 1.78813934326e-05 2.09228754044e-05

我在Ubuntu 10.10上使用Python 3.1.2。

为什么写a.py的{​​{1}}比从stdin读取要慢得多? 无论如何,我可以让这两个程序更快地进行通信吗?

2 个答案:

答案 0 :(得分:1)

我会看到在禁用输入和输出缓冲时是否可以重现这一点。我有一个预感,默认情况下输出是(行)缓冲的(因为它在大多数语言中:perl,.NET,C ++ iostreams)

答案 1 :(得分:0)

如果我尝试几次,数字的方差非常高。

也许你应该设置一个更加理智的测试来对stdin和stdout进行基准测试,而不会产生很多其他开销,所以你不要测量你的cpu上正在发生的其他事情。你也在测量字符串操作和浮点转换。