stdin кажется намного медленнее, чем stdout (python).Зачем? - PullRequest
10 голосов
/ 22 марта 2011

У меня есть две программы на Python (одна из них является подпроцессом), которые должны взаимодействовать друг с другом.В настоящее время я делаю это через stdin и stdout.Однако запись в подпроцесс 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

Я использую Python 3.1.2 в Ubuntu 10.10.

Почему запись в a.py stdin намного медленнее, чем чтение из stdout?Можно ли как-нибудь заставить эти две программы общаться быстрее?

Ответы [ 2 ]

1 голос
/ 28 марта 2011

Я бы посмотрел, можно ли воспроизвести это при отключении буферизации как на входе, так и на выходе.У меня есть догадка, что вывод (по умолчанию) буферизуется (строка) (как это происходит в большинстве языков: Perl, .NET, C ++ iostreams)

0 голосов
/ 22 марта 2011

Если я попытаюсь сделать это несколько раз, дисперсия чисел будет очень велика.

Может быть, вам следует установить более нормальный тест для сравнения stdin и stdout, без большого количества других накладных расходов, так что выне измеряйте другие вещи, которые происходят на вашем процессоре.Также вы измеряете строковые операции и преобразование с плавающей точкой.

...