Python의 표준 출력 버퍼 크기 늘리기

Nov 26 2020

파이썬 stdout에서 버퍼 크기를 8182 에서 늘리 거나 실제로 호출 할 때까지 플러시를 지연하는 방법이 flush있습니까?

작동하지 않는 시도한 것 :

  • 버퍼에 직접 액세스 할 수 있기 때문에 Windows에서이 문제를 해결할 수 있습니다 (예 : 이 게시물에 대한 답변 참조 ). 그러나 이것은 Unix에서는 작동하지 않습니다.
  • buffer생성자 에 전달 하여 파일의 버퍼 크기를 늘릴 수 있지만 stdout이미 생성되어 있습니다.
  • 버퍼링 ( python -u)을 끄면 분명히 상황이 악화됩니다!
  • 임시 버퍼를 사용하면 동일한 문제가 발생합니다 stdout. 임시 버퍼에서 8192 번째 바이트가 복사 될 때마다 플러시됩니다.

근거 : 여기서 목표는 콘솔 깜박임을 줄이는 것입니다. 에 따라, 모든 것을 버퍼링 이 질문은 참으로 내가 C 나 파이썬에서 윈도우 API를 사용하여 시도 할 때 예를 들어, 작동하지만 파이썬에서 8182 제한 내가 유닉스 주위에 얻을 수없는 문제를 일으키는 것으로 보인다.

답변

1 blhsing Nov 27 2020 at 05:29

로 사용 가능한 원시 stdout 스트림 sys.stdout.buffer을로 더 큰 버퍼 크기로 io.BufferedWriter래핑 한 다음 결과 버퍼링 된 바이너리 스트림을 다음을 사용하여 버퍼링 된 텍스트 스트림으로 래핑 할 수 있습니다 io.TextIOWrapper.

import io
import sys

sys.stdout = io.TextIOWrapper(io.BufferedWriter(sys.stdout.buffer, new_size))

다음은 수동 플러시가 호출 될 때까지 두 개의 10000 자 길이 인쇄 출력을 플러시하지 않도록 stdout의 버퍼 크기를 100000으로 늘리는 효과에 대한 데모입니다.

import io
import sys
import time

print('Original buffer size:', io.DEFAULT_BUFFER_SIZE)
for large_buffer in False, True:
    if large_buffer:
        print('Increasing buffer size...')
        sys.stdout = io.TextIOWrapper(io.BufferedWriter(sys.stdout.buffer, 100000))
    for i in range(2):
        time.sleep(2)
        print(str(i * 2) * 10000)
        time.sleep(2)
        print(str(i * 2 + 1) *10000)
        print(f'Flush #{i + 1}')
        sys.stdout.flush()

데모: https://repl.it/@blhsing/UnkemptGullibleDecompiler

1 cz Nov 27 2020 at 16:39

실제로 매우 간단합니다.

my_stdout = open( 1, "w", buffering = 100000 )
  • 1입니다 fileno위해 stdout.
  • sys.stdout = my_stdout기본 print대상을 변경하는 데 사용할 수 있습니다 .
  • 나는 이것을 유닉스에서만 테스트했습니다.