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
대상을 변경하는 데 사용할 수 있습니다 .- 나는 이것을 유닉스에서만 테스트했습니다.