Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/47: Рейтинг темы: голосов - 47, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 30.11.2019
Сообщений: 3

Скорость вывода в консоль

30.11.2019, 20:10. Показов 9631. Ответов 19

Студворк — интернет-сервис помощи студентам
Здравствуйте. У меня есть список элементов, его заполнение занимает доли секунды, но вывод в консоль порядка 30-40 секунд.
В списке 180.000 - 200.000 элементов, их нужно выводить каждый раз с новой строки. При выводе в консоль, как я понял, программа ждет пока символ напечатается, а потом отправляет на печать следующий. Можно ли как-то вывести их хотя бы
за 10-15 секунд (желательно как можно быстрее), или есть какое-то ограничение по скорости? Может есть модуль для такой
операции?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.11.2019, 20:10
Ответы с готовыми решениями:

Обработка вывода в консоль от программы
Всем доброго времени суток. Подскажите пожалуйста, можно ли реализовать следующее: - Имеется программа (под виндой) без графического...

Подготовить числа для вывода на консоль через ASCII и вывести на консоль
В регистре eax находится число, которое нужно превратить в ASCII-код и вывести на консоль символы, которые соответствуют полученному. ...

Буферизация вывода в консоль, и цветной вывод в консоль
Потребовалось реализовать цветной вывод массивов в консоль(некоторые значения выделить зеленым). Для этого...

19
 Аватар для codcw
815 / 527 / 214
Регистрация: 22.12.2017
Сообщений: 1,495
01.12.2019, 05:24
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import math
with open('test.txt','w') as f:
        f.write('\n'.join(list(str(math.factorial(99999)))))
import timeit
a1=timeit.timeit("print(open('test.txt').read())", number = 1)
a2=timeit.timeit("stdout.write(open('test.txt').read())",setup='from sys import stdout', number = 1)
a3=timeit.timeit("os.write(os.open('test2.txt', os.O_WRONLY), open('test.txt', 'r').read().encode())",setup='import os', number = 1)
print('\n',a1,a2,a3,sep='\n')
 
 
 
 
5.853710182966125
5.801569472562138
0.0077020472176236865
>>>
ну и задачки у вас
умельцы, признавайтесь, как вместо 'test2.txt' подставить pathlike объект консоли?
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
01.12.2019, 08:06
Цитата Сообщение от MopKowKa Посмотреть сообщение
При выводе в консоль, как я понял, программа ждет пока символ напечатается, а потом отправляет на печать следующий.
Не совсем так. Буфер вывода какой-то есть, но он может быть переполнен и тогда да - программа не сможет положить в буфер новые данные, пока старые не выведутся на консоль.

Внезапно, первый вариант оказался быстрее:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import sys
import random
 
ls = [random.random() for i in range(200_000)]
 
def func1():
    print(*ls, sep='\n')
 
def func2():
    for i in ls:
        sys.stdout.write(str(i))
        sys.stdout.write('\n')
 
def func3():
    for i in ls:
        sys.stdout.write(str(i))
        sys.stdout.write('\n')
        sys.stdout.flush()
 
import timeit
a1 = timeit.timeit('func1()', setup='from __main__ import func1', number=1)
a2 = timeit.timeit('func2()', setup='from __main__ import func2', number=1)
a3 = timeit.timeit('func3()', setup='from __main__ import func3', number=1)
print('\n',a1,a2,a3,sep='\n')
Code
1
2
3
3.510073644982185
4.161180554016028
4.44471001799684
Цитата Сообщение от codcw Посмотреть сообщение
подставить pathlike объект консоли?
Что такое pathlike?

Добавлено через 2 минуты
ха!
Python
1
2
def func4():
    sys.stdout.write('\n'.join(map(str, ls)))
Code
1
2
3
4
3.559078374004457
3.905101175972959
4.34003376099281
1.737288855976658
Добавлено через 7 минут
Отключение буфера даёт ещё немного прироста скорости:
Python
1
2
3
4
5
6
# reopen stdout file descriptor with write mode
# and 0 as the buffer size (unbuffered)
unbuffered = io.TextIOWrapper(open(sys.stdout.fileno(), 'wb', 0), write_through=True)
 
def func5():
    unbuffered.write('\n'.join(map(str, ls)))
1
 Аватар для codcw
815 / 527 / 214
Регистрация: 22.12.2017
Сообщений: 1,495
01.12.2019, 08:53
Рыжий Лис,
os.write(fd, str)
Write the bytestring in str to file descriptor fd.
This function is intended for low-level I/O and must be applied to a file descriptor as returned by os.open() or pipe().
os.open(path, flags, mode=0o777, *, dir_fd=None)
Changed in version 3.6: Accepts a path-like object.
path-like object
An object representing a file system path. A path-like object is either a str or bytes object representing a path, or an object implementing the os.PathLike protocol. An object that supports the os.PathLike protocol can be converted to a str or bytes file system path by calling the os.fspath() function; os.fsdecode() and os.fsencode() can be used to guarantee a str or bytes result instead, respectively. Introduced by PEP 519.
в общем os.open() просит путь для записи, а поскольку по докам туда можно передать некий path-like object, то я подумал что можно что-то придумать для вывода в консоль
дело в том, что я на stackoverflow нашел такой пример
Python
1
os.write(1, "".join(results))
но выдаёт ошибку, и просит таки нормальный file descriptor, который уже пришлось давать с помощью os.open()
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
01.12.2019, 09:12
Цитата Сообщение от codcw Посмотреть сообщение
но выдаёт ошибку, и просит таки нормальный file descriptor
Python
1
open(sys.stdout.fileno(), 'wb')
где sys.stdout.fileno() как раз возвращает 1.
0
 Аватар для codcw
815 / 527 / 214
Регистрация: 22.12.2017
Сообщений: 1,495
01.12.2019, 09:19
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
a3=timeit.timeit("os.write(1, open('test.txt', 'r').read().encode())",setup='import os', number = 1)
 
 
Traceback (most recent call last):
  File "C:\censored\dfgdfg.py", line 7, in <module>
    a3=timeit.timeit("os.write(1, open('test.txt', 'r').read().encode())",setup='import os', number = 1)
  File "C:\censored\timeit.py", line 233, in timeit
    return Timer(stmt, setup, timer, globals).timeit(number)
  File "C:\censored\timeit.py", line 178, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
OSError: [Errno 9] Bad file descriptor
>>>
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
01.12.2019, 09:21
Python
1
2
3
4
5
def func6():
    fn = sys.stdout.fileno()
    for i in ls:
        os.write(fn, bytes(str(i), encoding='utf8'))
        os.write(fn, b'\n')
Медленно.
0
 Аватар для codcw
815 / 527 / 214
Регистрация: 22.12.2017
Сообщений: 1,495
01.12.2019, 09:37
Python
1
2
3
8.122584128265231
8.11423634089563
0.2931352336421327
быстрее чем просто print в ~27 раз, думаю не так уж и плохо
0
0 / 0 / 0
Регистрация: 30.11.2019
Сообщений: 3
01.12.2019, 13:07  [ТС]
Python
1
2
3
arr = list([str(i) for i in range(100000, 300000)])
 
print('\n'.join(arr))
Такой вывод у меня занимает примерно 29-32 секунды.
Можете мне написать, что стоит вместо "print('\n'.join(arr))"?
Попробовал как вы говорили, но у меня все то же время.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
01.12.2019, 13:10
Python
1
sys.stdout.write('\n'.join(map(str, range(100000, 200000))))
Этот вариант показал себя быстрее.
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
01.12.2019, 13:37
На всякий случай - выводить в консоль 200 тысяч цифр и затем ждать когда оно выведется (да еще быстро) - это немножко идиотизм. Вы все равно увидите в консоли только последнюю сотню. Тогда зачем выводить все?
Но, как говорится, хозяин-барин.
И вообще зачем все это нужно ТС-у - никому не интересно?
0
0 / 0 / 0
Регистрация: 30.11.2019
Сообщений: 3
01.12.2019, 13:42  [ТС]
Цитата Сообщение от codcw Посмотреть сообщение
быстрее чем просто print в ~27 раз, думаю не так уж и плохо
Не получается, возможно я не так понимаю. Пожалуйста напишите как заменить print в это фрагменте.
Python
1
2
3
arr = list([str(i) for i in range(100000, 300000)])
 
print('\n'.join(arr))
Я пробовал все, что мне написали, но у меня время не меняется. Иногда даже вырастает...
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
01.12.2019, 13:43
Цитата Сообщение от Garry Galler Посмотреть сообщение
Вы все равно увидите в консоли только последнюю сотню
У меня консоль настроена на бесконечную прокрутку. Не говорите за всех.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
01.12.2019, 13:49
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
У меня консоль настроена на бесконечную прокрутку
У меня тоже. Но максимальный размер консоли по ширине == высоте экрана. Экран у вас тоже бесконечный?

P.S. Все эти попытки оптимизации вывода в консоль довольно бессмысленны, так как все зависит от проца.
К примеру, на моем уже довольно стареньком 4-x ядерном быстрее чем за 17 сек уже никак не выходит. Упс...
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
01.12.2019, 13:52
Не понимаю вопроса. Справа в консоли есть полоса прокрутки, всегда можно отмотать назад, хоть в начало.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
01.12.2019, 13:56
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Не понимаю вопроса
Бессмысленно писать в консоль весь вывод. Если ты не собираешься читать его весь - от первой до последней цифры.
Одно дело - логирование (но тут и скорость нафиг не нужна). Другое - совершенно глупая затея ТС по созерцанию 200 тысяч чиселок в консоли.
0
 Аватар для codcw
815 / 527 / 214
Регистрация: 22.12.2017
Сообщений: 1,495
01.12.2019, 19:47
Лучший ответ Сообщение было отмечено MopKowKa как решение

Решение

Python
1
2
3
4
5
6
7
import os
with open('test2.txt','w') as f:
    f.write('\n'.join([str(i) for i in range(100000, 300000)]))
def f6():
    with open('test2.txt','r') as f:
        os.write(1, f.read().encode())
f6()
писать так, запускать через консоль, но почему-то не хочет выводить без прохода циклом
Python
1
2
3
4
def f6():
    with open('test2.txt','r') as f:
        for i in f.read():
            os.write(1, i.encode())
без него выводит ~4000+ символов и глохнет(
в общем, забудьте про прибавку к скорости, сильно быстрее встроенного принта вряд ли выйдет

Добавлено через 1 минуту
но на более мелких выводах os.write() таки выигрывает
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import os,timeit,sys
with open('test.txt','w') as f:
    f.write('\n'.join([str(i) for i in range(1, 4000)]))
def fos():
    with open('test.txt','r') as f:
        os.write(1, f.read().encode())
def fstd():
    with open('test.txt','r') as f:
        print(f.read())
def fsys():
    with open('test.txt','r') as f:
        sys.stdout.write(f.read())
a1 = timeit.timeit('fos()', setup='from fast import fos', number=100)
a2 = timeit.timeit('fstd()', setup='from fast import fstd', number=100)
a3 = timeit.timeit('fsys()', setup='from fast import fsys', number=100)
print('\n',a1,'\n',a2,'\n',a3)
 
 7.456094529996452
 7.459921755359111
 7.460034028335134
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
01.12.2019, 21:24
Цитата Сообщение от codcw Посмотреть сообщение
7.456094529996452
7.459921755359111
7.460034028335134
У меня:
Code
1
2
3
 21.15617041687896
 20.16587300228949
 19.997375224418093
Все эти тесты на скорость вывода - бесполезная шляпа.
Потому что нельзя найти алгоритма оптимизации, который будет аппаратно-независимым.
0
 Аватар для codcw
815 / 527 / 214
Регистрация: 22.12.2017
Сообщений: 1,495
01.12.2019, 21:32
согласен, а чтоб порядок был как у меня надо было второй раз запустить, оно там вроде в памяти выстраивается как надо после первого прохода
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
02.12.2019, 11:54
Солидарен с Garry Galler.
Операция вывода в консоль - в принципе медленная. Ухищряться с буферами можно, но, вероятнее всего, вам это просто не нужно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.12.2019, 11:54
Помогаю со студенческими работами здесь

Перехват вывода консольного приложения (сложный вариант вывода приложением информации на консоль)
Добрый день. . Столкнулся с такой проблемой. Есть консольное приложение &quot;cisco vpn client 4.7&quot;, которое работает как консольное...

консоль UART и нестандартная скорость
есть некое устройство с консолью. по ряду причин скорость не стандартная 48000. какие адаптеры умеют её? попробовал cp2102 (был под рукой)...

Нет вывода в консоль
Всем привет! Установил QtCreator и хочу запустить &quot;Hello world!&quot; в консоле, проект собирается без ошибок, но на консоль ничего не...

Кодировка вывода в консоль
Здравствуйте, у меня Windows Xp sp 3, не подскажите кодировку вывода на консоль русского текста, текст выводит системное приложение...

Ошибка вывода на консоль
В Debug выводит адрес почему-то. В release же все нормально. Почему так и как это исправить? #include &lt;iostream&gt; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru