Почему печать в stdout такую медленную? Можно ли ускорить?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Почему печать в stdout такую медленную? Можно ли ускорить?

Сообщение Anonymous »

Я всегда был поражен/разочарован тем, сколько времени требуется, чтобы просто вывести на терминал с оператором печати. После недавней мучительно медленной регистрации я решил изучить его и был весьма удивлен, обнаружив, что почти все < /strong>, потраченное время, ждет, пока терминал обрабатывает результаты.print_timer.py 'В нижней части этого вопроса) для сравнения времени при написании 100 тыс. Строний с stdout, для файла и с помощью stdout, перенаправленного на/dev/null . Вот результат времени: < /p>

$ python print_timer.py
this is a test
this is a test

this is a test
-----
timing summary (100k lines each)
-----
print :11.950 s
write to file (+ fsync) : 0.122 s
print with stdout = /dev/null : 0.050 s
< /code>

вау. Чтобы убедиться, что Python не делает что -то за кулисами, например, признание того, что я переназнал stdout to /dev /null или что -то в этом роде, я сделал перенаправление вне сценария ... < /p>

$ python print_timer.py > /dev/null
-----
timing summary (100k lines each)
-----
print : 0.053 s
write to file (+fsync) : 0.108 s
print with stdout = /dev/null : 0.045 s
< /code>

Так что это не трюк Python, это просто терминал. Я всегда знал, что вывод спускается в /dev /null, ускорившись, но никогда не думал, что это было так важно! Как может быть то, что написание на физический диск намного быстрее, чем писать на «экран» (предположительно, всеобъемлющий OP) и эффективно так же быстро, как просто сброс в мусор с /dev /null? В " ... но я не полностью понимаю. Что может занять так много времени? Действительно медленные цифры, выше, с моим терминалом Gnome, взорванным до 1920x1200. Если я уменьшу его очень маленький, я получу ... < /p>

-----
timing summary (100k lines each)
-----
print : 2.920 s
write to file (+fsync) : 0.121 s
print with stdout = /dev/null : 0.048 s
< /code>

Это, безусловно, лучше (~ 4x), но не меняет мой вопрос. Это только добавляет к моему вопросу, поскольку я не понимаю, почему экранинг терминала должен замедлить приложение, написанное в Stdout. Почему моя программа должна ждать, пока рендеринг экрана будет продолжаться? Мне еще предстоит экспериментировать. Мне действительно кажется, что терминал должен иметь возможность буферизировать все входящие данные, разрабатывать/рендерировать их невидимо, и только отображать самый последний кусок, который виден в текущей конфигурации экрана при разумной частоте кадров. Поэтому, если я могу написать+fsync на диск за ~ 0,1 секунды, терминал должен иметь возможность выполнить ту же операцию в чем -то из этого порядка (возможно, с несколькими обновлениями экрана, пока он это сделал). < /P>

Я все еще надеюсь, что есть настройка TTY, которые могут быть изменены с стороны приложения, чтобы лучше улучшить поведение для программирования. Если это строго проблема с применением терминала, то, возможно, это даже не принадлежит к Stackoverflow? < /P>

Чего мне не хватает?import time, sys, tty
import os

lineCount = 100000
line = "this is a test"
summary = ""

cmd = "print"
startTime_s = time.time()
for x in range(lineCount):
print line
t = time.time() - startTime_s
summary += "%-30s:%6.3f s\n" % (cmd, t)

#Add a newline to match line outputs above...
line += "\n"

cmd = "write to file (+fsync)"
fp = file("out.txt", "w")
startTime_s = time.time()
for x in range(lineCount):
fp.write(line)
os.fsync(fp.fileno())
t = time.time() - startTime_s
summary += "%-30s:%6.3f s\n" % (cmd, t)

cmd = "print with stdout = /dev/null"
sys.stdout = file(os.devnull, "w")
startTime_s = time.time()
for x in range(lineCount):
fp.write(line)
t = time.time() - startTime_s
summary += "%-30s:%6.3f s\n" % (cmd, t)

print >> sys.stderr, "-----"
print >> sys.stderr, "timing summary (100k lines each)"
print >> sys.stderr, "-----"
print >> sys.stderr, summary


Подробнее здесь: https://stackoverflow.com/questions/385 ... be-sped-up
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»