我遇到了picotui库,并很好奇它的工作原理。
我看到here(第147行)使用了它:
os.read(0,32)
google说0代表标准输入,但从标准输入中读取的可接受答案是通过
sys.stdin.buffer.read()
我想知道两者之间有什么区别。哪个更快?哪个是更便携的版本?
答案 0 :(得分:4)
使用os.read(0, 32)
是 unbuffered 的读取操作,直接调用操作系统级别的系统调用,并且仅读取非常具体的数据量(并有力保证单独的调用不会读取比那更多的)。有时-例如,如果您要将标准输入传递给其他程序,并让 it 读取其余未决数据,则特别需要此。
sys.stdin.buffer.read()
是一种缓冲读取(并且,在未指定长度的情况下,该读取将尽可能多地读取)。缓冲读取可能会读取您立即要求的更多数据(即使它仅返回所请求的数量,将其余的保留在缓冲区中以用于处理将来的请求),以减少数量进行大量系统调用,从而在读取大量数据时具有较低的上下文切换开销(特别是在您可能会进行大量短读取的情况下,缓冲减少了用户级和OS内核之间的往返次数)。>
其中哪些是适当的,很大程度上取决于实现和运行时环境的详细信息,而一个问题询问哪种情况适合于给定的场景将需要包括更多的细节,以免泛滥。 重要的是,不要混用;在缓冲读取之后执行无缓冲读取可能会产生无法预料的结果,因为无法知道操作系统已经读取了多少数据来填充读取缓冲区的尚未使用的部分。