搜索操作的基础是否会影响其运行速度,或者它是如何计算某些标准偏移的?

时间:2013-07-07 18:55:06

标签: python file-io seek

例如,在python中,是这样的:

with open('myfile', 'rb') as f:
  f.seek(0, 2)  # seek to EOF
  file_size = f.tell()

  f.seek(file_size - 10)
  print f.read(10)

  f.seek(file_size - 20)
  print f.read(10)

  f.seek(file_size - 30)
  print f.read(10)
  ...

效率低于此:

with open('myfile', 'rb') as f:
  f.seek(-10, 2)
  print f.read(10)

  f.seek(-20, 1)
  print f.read(10)

  f.seek(-20, 1)
  print f.read(10)
  ...

2 个答案:

答案 0 :(得分:3)

文件中的读取位置是由OS内核维护的简单索引;没有涉及身体的头部动作。

C代码从当前位置减去10或者你在python中计算新位置将产生很小的差异。

答案 1 :(得分:1)

请注意,由于read移动光标位置,程序不相同!所以你要调用f.seek(-20, 1),除非你想要反复读取相同的10个字节。

此外,对ftell的额外调用可能会使第一个(不知不觉)变慢。您的程序之间的另一个区别是,如果在您阅读文件时,它们的行为会略有不同。

另请注意,您可以直接向EOF寻求,如下所示:

with open('myfile', 'rb') as f:
    f.seek(-10, 2) # Seek from EOF
    print(f.read(10))

    f.seek(-20, 1)
    print(f.read(10))

    f.seek(-20, 1)
    print(f.read(10))