Чтение файла с использованием функции диапазона - PullRequest
0 голосов
/ 28 января 2019

Я читаю большой файл порциями, например

>  def gen_data(data):
>             for i in range(0, len(data), chunk_sz):
>                 yield data[i: i + chunk_sz]

Если я использую переменную длины вместо len (data), что-то в этом роде

length_of_file = len(data)
def gen_data(data):
    for i in range(0, length_of_file, chunk_sz):
        yield data[i: i + chunk_sz]

Каким будет производительностьулучшения для больших файлов.Я тестировал маленькие, но не видел никаких изменений.

PS Я из C / C ++ фона, где вычисления в каждом повторении в цикле while или for - плохая практика, потому что он выполняется для каждого вызова.

Ответы [ 2 ]

0 голосов
/ 28 января 2019
Цикл

Python for - это не цикл C for, а действительно foreach цикл.В вашем примере:

for i in range(0, len(data), chunk_sz):

range() вызывается только один раз, затем python выполняет итерацию возвращаемого значения (list в python2, итерируемый объект range в python3).IOW, из этого POV ваши фрагменты эквивалентны - разница в том, что второй фрагмент использует нелокальную переменную length_of_file, так что вы на самом деле получаете снижение производительности при ее разрешении.

Яиз фона C / C ++, где вычисления в каждом повторении в цикле while или for - плохая практика, потому что он выполняется для каждого вызова

За исключением возможных оптимизаций возможной компиляции, это верно для большинства, если не для всех языков.

Это, как говорится и как уже упоминалось в комментариях или ответах: это не то, как вы читаете файл кусками - вам нужен первый фрагмент SurajM.

0 голосов
/ 28 января 2019

Используйте этот код для чтения большого файла в куски:

def read_in_chunks(file_object, chunk_size=1024):
    """Lazy function (generator) to read a file piece by piece.
    Default chunk size: 1k."""
    while True:
        data = file_object.read(chunk_size)
        if not data:
            break
        yield data


f = open('really_big_file.dat')
for piece in read_in_chunks(f):
    process_data(piece)

Другой вариант с использованием iter

f = open('really_big_file.dat')
def read1k():
    return f.read(1024)

for piece in iter(read1k, ''):
    process_data(piece)
...