Я всегда был поражен/разочарован тем, сколько времени требуется, чтобы просто вывести на терминал с оператором печати. После недавней мучительно медленной регистрации я решил изучить его и был весьма удивлен, обнаружив, что почти все < /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
Почему печать в stdout такую медленную? Можно ли ускорить? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Ничего не происходит после subprocess.stdout.readline()/subprocess.stdout.read()
Anonymous » » в форуме Python - 0 Ответы
- 60 Просмотры
-
Последнее сообщение Anonymous
-