2013-07-07 1 views
1

Например, в 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) 
    ... 
+1

Это то же самое. И используйте 'with' при работе с файлами. – mishik

ответ

2

Позиция чтения в файле простой индекс поддерживается ядром ОС; нет никаких физических движений головы.

Код C, вычитающий 10 из текущей позиции или вычисляющий новое положение в python, будет иметь очень мало различий.

+0

Это несколько неточно, позиция управляется ядром, а не библиотеками пользовательского пространства C. Вызов 'f.tell' или' f.seek' приводит к syscall 'lseek'. – phihag

+0

@phihag: это не имеет большого значения для истории исполнения, но я исправил заявление. –

+0

Почему вы думаете, что это не важно для производительности? Я бы предположил, что сам syscall очень медленный по сравнению с просто поиском значения в пользовательском пространстве (производительность всего приложения, по крайней мере, как представлено здесь, действительно, скорее всего, полностью не зависит от какого-либо кода на Python и затмевается временем загрузки интерпретатор python). И, подойдя ближе, я должен отменить свой предыдущий комментарий - по крайней мере, мой libc кэширует текущий индекс в пользовательском пространстве. – phihag

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))