gpt4 book ai didi

python - Python 中 f.seek() 的复杂性

转载 作者:太空狗 更新时间:2023-10-29 21:25:23 24 4
gpt4 key购买 nike

f.seek(500000,0) 是否在到达第 500000 个之前遍历文件的所有前 499999 个字符?换句话说,f.seek(n,0) 的阶数是 O(n) 还是 O(1)?

最佳答案

您需要更具体地说明 f 是什么类型的对象。

如果 f 是一个正常的 io module对于存储在磁盘上的文件对象,您必须确定您是否正在处理:

  • 原始二进制文件对象
  • 一个缓冲对象,包装原始二进制文件
  • 一个 TextIO 对象,包装缓冲区
  • 内存中的 BytesIOTextIO 对象

第一个选项只使用 lseek system call重新定位文件描述符位置。此调用是否为 O(1) 取决于操作系统和您拥有的文件系统类型。对于具有 ext4 文件系统的 Linux 系统,lseek is O(1) .

缓冲区只是清除缓冲区 if your seek target is outside of the current buffered region并读入新的缓冲区数据。这也是 O(1),但固定成本更高。

对于文本文件,事情要复杂得多,因为可变字节长度编解码器和行尾翻译意味着您不能总是将二进制流位置映射到文本位置而不从头开始扫描。该实现不允许非零当前位置或结束相对寻道,并且最好尽量减少绝对寻道所读取的数据量。 Internal state shared with the text decoder跟踪 recent 'safe point' to seek back to并向前阅读到所需的位置。最坏的情况是 O(n)。

内存中的文件对象实际上只是很长的可寻址数组。寻找是 O(1),因为您可以改变当前位置指针值。

有许多其他类似文件的对象可能支持也可能不支持查找。他们如何处理搜索取决于实现。

等等。所以,视情况而定

关于python - Python 中 f.seek() 的复杂性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51801213/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com