You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python的print()函数是阻塞还是非阻塞?脚本性能优化问询

Python的print()函数在Linux下是阻塞还是非阻塞?

Python的print()默认输出到控制台(stdout)时是阻塞的,原因如下:

  • print()底层会调用sys.stdout.write()写入内容、添加换行符,最后触发sys.stdout.flush()(当stdout关联终端时,默认是行缓冲模式,每输出一行就会自动执行flush)。
  • 在Linux系统中,write()系统调用本身是阻塞的:当终端输出缓冲区被占满,或者终端需要等待用户操作(比如窗口未响应),Python进程会被挂起,直到内核完成输出操作才会继续执行后续代码。

为什么大量print()会拖慢脚本速度?

  • 频繁调用print()会触发多次系统调用,而系统调用的开销远高于Python内部操作。
  • 终端本身的渲染速度有限,即使Python把数据交给内核,终端显示内容也需要时间,这会反过来让write()调用阻塞等待。

优化大量输出脚本速度的方法

  • 减少print()调用次数:把多行内容拼接成一个大字符串,一次性调用print()或者sys.stdout.write(),避免频繁触发系统调用。
  • 手动控制缓冲策略:
    import sys
    from io import StringIO
    
    # 方式1:设置大尺寸全缓冲,降低系统调用频率
    sys.stdout = open(sys.stdout.fileno(), 'w', buffering=1024*1024)  # 1MB缓冲区
    
    # 方式2:用StringIO缓存所有内容,最后一次性输出
    buffer = StringIO()
    for data in your_large_dataset:
        buffer.write(f"{data}\n")
    sys.stdout.write(buffer.getvalue())
    buffer.close()
    
  • 关闭自动flush(非实时输出场景):如果不需要实时在控制台看到输出,可将stdout改为块缓冲模式,只有缓冲区满了才会触发输出,减少系统调用次数。注意这种情况下控制台不会实时更新内容,直到缓冲区满或者手动调用sys.stdout.flush()。
  • 重定向输出到文件/管道:如果不需要在控制台查看输出,运行脚本时把输出重定向到文件(比如python your_script.py > output.log),此时stdout会切换为块缓冲,输出效率会大幅提升。

内容的提问来源于stack exchange,提问作者Jim Fell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 01:50:05