python - os.read(0,) 与 python 中的 sys.stdin.buffer.read()
问题描述
我遇到了picotui库,很想知道它是如何工作的。
我在这里(第 147 行)看到它使用:
os.read(0,32)
根据 Google 0 表示stdin
,但从标准输入读取的公认答案是通过
sys.stdin.buffer.read()
我想知道两者之间有什么区别。哪个更快?哪个版本更便携?
解决方案
使用os.read(0, 32)
是无缓冲读取,直接调用操作系统级别的系统调用并仅读取非常特定数量的数据(并保证单个调用不会读取更多数据)。有时——例如,如果你要将你的标准输入交给另一个程序并让它读取 其余的待处理数据——你特别需要它。
sys.stdin.buffer.read()
是缓冲读取(并且,没有指定长度,读取尽可能多)。缓冲读取可能会读取您立即要求的更多数据(即使它只返回请求的数量,将其余数据保留在缓冲区中以用于处理将来的请求),以减少系统调用的数量,从而使用读取大量数据时降低上下文切换开销(特别是当您要进行大量短读取时,缓冲减少了用户空间和操作系统内核之间的往返次数)。
其中哪一个是合适的,很大程度上取决于实现和运行时环境的细节,而询问哪个适合给定场景的问题需要包含更多细节,以免过于宽泛。重要的是不要混合它们;在缓冲读取之后执行非缓冲读取可能会产生不可预测的结果,因为无法知道操作系统已经读取了多少数据来填充读取缓冲区中尚未使用的部分。
推荐阅读
- android-ndk - CMake ExternalProject_Add 上的 Android Studio java.nio.file.AccessDeniedException
- javascript - 范围从到数组中的键和值
- php - 使用 all() 的 Yii2 查询返回的数据少于预期
- python - 如何将参数类型从 str 更改为 cmd.Cmd 命令的对象
- mariadb - 将参数传递给存储过程的问题
- r - 在多边形 shapefile 中创建随机点
- xcode - 如何在 Metal 中测量 CPU/GPU 数据传输开销
- javascript - 浏览器扩展权限请求可以取消吗?
- reactjs - 从 Spotify API 获取访问令牌时出错
- c++ - '&' 符号在模板参数中是如何工作的?