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
相关产品推荐
相关产品推荐

