【问题标题】:Increase Python's stdout buffer size增加 Python 的标准输出缓冲区大小
【发布时间】:2020-11-26 11:25:53
【问题描述】:

有没有办法在 Python 中从 8182 增加 stdout 缓冲区大小 延迟刷新,直到我真正打电话给flush

我尝试过但不起作用的方法:

  • 我可以在 Windows 上解决这个问题,因为我可以直接访问缓冲区(例如see my answer to this post)。但这不适用于 Unix。
  • 我可以通过将buffer 传递给构造函数来增加文件的缓冲区大小,但是stdout 已经构造好了。
  • Turning off buffering (python -u) 显然让事情变得更糟!
  • 使用临时缓冲区会遇到同样的问题 - 在从临时缓冲区复制每个第 8192 个字节后,stdout 会被刷新。

理由:这里的目的是减少控制台闪烁。根据this question 缓冲所有内容确实有效,例如当我尝试使用 C 或在 Python 中使用 Windows API 时,但 Python 中的 8182 限制似乎导致了我无法在 Unix 上解决的问题。

【问题讨论】:

  • 我想知道你为什么需要这样做:)
  • 为什么要这样做?听起来您可能会更好地使用其他方法,例如自己进行缓冲。
  • “当临时缓冲区最终被复制到标准输出时,使用临时缓冲区会遇到同样的问题。” - 什么问题?
  • 听起来你应该问一个关于避免终端闪烁的问题,而不是关于缓冲区大小调整的问题。

标签: python


【解决方案1】:

您可以使用io.BufferedWriter 包装原始标准输出流(以sys.stdout.buffer 提供),并使用更大的缓冲区大小使用io.BufferedWriter,然后使用io.TextIOWrapper 将生成的缓冲二进制流包装为缓冲文本流:

import io
import sys

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

这里演示了将 stdout 的缓冲区大小增加到 100000 的效果,以便在调用手动刷新之前它不会刷新两个 10000 字符长的打印输出:

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

【讨论】:

  • 谢谢,但这只是将数据保存在BufferedWriter 中,直到您致电sys.stdout.flush。当BufferedWriter 推送到 real 标准输出时,它仍然存在相同的潜在问题 - 每写入第 8182 个字节就会刷新(来自BufferedWriter)。也就是说,我注意到在写入 PyCharm 等慢速终端时,这大大提高了应用程序的性能(如果不是闪烁的话)。
【解决方案2】:

找到了答案,其实很简单:

my_stdout = open( 1, "w", buffering = 100000 )
  • 1filenostdout
  • sys.stdout = my_stdout 可用于更改默认的print 目标。
  • 我只在 Unix 上测试过。

【讨论】:

    猜你喜欢
    • 2018-12-12
    • 2011-01-05
    • 2019-08-06
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多