我遇到了picotui库,很想知道它是如何工作的。
我在这里看到(第 147 行)它使用:
os.read(0,32)
根据谷歌 0 代表stdin
,但也从 stdin 读取的公认答案是通过
sys.stdin.buffer.read()
我想知道两者之间有什么区别。哪个更快?哪个版本更便携?
使用os.read(0, 32)
是一种无缓冲读取,直接调用操作系统级别的系统调用并仅读取非常特定数量的数据(并严格保证单个调用不会读取更多)。有时 - 例如,如果你要把你的stdin交给另一个程序并让它读取其余的待处理数据 - 你特别需要它。
sys.stdin.buffer.read()
是缓冲读取(并且,在不指定长度的情况下,读取尽可能多的读取)。缓冲读取可能会读取您立即请求的更多数据(即使它只返回请求的数量,将其余数据保存在缓冲区中以用于处理未来的请求),以减少发出的系统调用的数量,从而在读取大量数据时以较低的上下文切换开销运行(特别是,当您本来会执行大量短读取时, 缓冲减少了用户空间和操作系统内核之间的往返次数)。
其中哪一个合适在很大程度上取决于实现和运行时环境细节,询问哪个适合给定方案的问题需要包含更多详细信息,以免过于宽泛。重要的是你不要混合它们;在缓冲读取后执行无缓冲读取可能会产生不可预测的结果,因为无法知道操作系统已经读取了多少数据来填充读取缓冲区中尚未使用的部分。