首页 > 解决方案 > os.read(0,) 与 python 中的 sys.stdin.buffer.read()

问题描述

我遇到了picotui库,很想知道它是如何工作的。

我在这里(第 147 行)看到它使用:

os.read(0,32)

根据 Google 0 表示stdin,但从标准输入读取的公认答案是通过

sys.stdin.buffer.read()

我想知道两者之间有什么区别。哪个更快?哪个版本更便携?

标签: pythonstdin

解决方案


使用os.read(0, 32)无缓冲读取,直接调用操作系统级别的系统调用并仅读取非常特定数量的数据(并保证单个调用不会读取更多数据)。有时——例如,如果你要将你的标准输入交给另一个程序并让它读取 其余的待处理数据——你特别需要它。

sys.stdin.buffer.read()缓冲读取(并且,没有指定长度,读取尽可能多)。缓冲读取可能会读取您立即要求的更多数据(即使它只返回请求的数量,将其余数据保留在缓冲区中以用于处理将来的请求),以减少系统调用的数量,从而使用读取大量数据时降低上下文切换开销(特别是当您要进行大量短读取时,缓冲减少了用户空间和操作系统内核之间的往返次数)。

其中哪一个是合适的,很大程度上取决于实现和运行时环境的细节,而询问哪个适合给定场景的问题需要包含更多细节,以免过于宽泛。重要的是不要混合它们;在缓冲读取之后执行非缓冲读取可能会产生不可预测的结果,因为无法知道操作系统已经读取了多少数据来填充读取缓冲区中尚未使用的部分。


推荐阅读