深入解析:Python的输出缓冲区机制

在非交互模式下执行python脚本的时候,会遇到“显示卡顿”的情况,执行过程不能够实时显示到屏幕上,也就不能实时监测执行的情况。

想到了这应该是缓冲区设置的问题,因为它既没有等到程序完全执行完才一次性输出,也没有实时输出,是没有规律地显示出来。

1.shell脚本是凭借echo命令建立,遇到换行符\n就会刷新缓冲区,将内容输出

2.python在交互模式下同shell相同,但是在非交互模式下.py,默认采用的是“块缓冲”模式,也就说当想要输出的内容会先存放到缓冲区,等到缓冲区满了,亦或是过程中有flush()执行,或者工具结束了,才会输出

解决方案

1.给print函数加默认参数print('python',flush=True)

2.执行python脚本的时候,添加参数-u,禁用缓冲python -u test.py

3.设置环境变量,全局禁用缓冲PYTHONUNBUFFERED=1

或者通过shell脚本拉起python的时候,设置环境变量,该脚本对应的执行的python就不会采用缓冲

python默认为“块缓冲”理由:

核心原因时“效率优先”,计算机在向终端、文件输出内容的I\O操作的成本远高于内存的数据处理,如果python实时刷新的话,那么每输出一行,计算机就要向外设发送一次I\O请求,而块缓冲会大大降低I\O的次数,提升效率。

同时,计算机中,应用程序(比如 Python 脚本)不能直接操作外设,必须通过 “系统调用”(比如write()函数)让内核介入 —— 这个过程会发生 “用户态→内核态” 的切换,切换本身就有固定的性能成本(比如保存上下文、权限校验等)。

另外,很多外设(比如磁盘、网络接口)本身就对 “大块连续数据” 的处理效率更高。

posted @ 2025-09-17 20:42  yxysuanfa  阅读(49)  评论(0)    收藏  举报