Эффективная итерация байтов переменной по строке в Python

#python #file-io

#python #файл-ввод-вывод

Вопрос:

Я читаю большой (500 МБ) двоичный файл на Python и разбираю его побайтно в структуру данных Python. Этот файл представляет собой разреженную сетку данных. В зависимости от формата иногда мне нужно прочитать один байт, два байта или четыре байта за раз. По бюрократическим причинам я обязан делать это на Python, а не на C.

Я ищу эффективные во время выполнения механизмы для выполнения этого на Python. Ниже приведен упрощенный пример того, что я делаю сейчас:

 with open(filename,'rb') as inFile:
 nCoords = struct.unpack('!i',inFile.read(4))[0]
 for i in range(nCoords):
    coord = (struct.unpack_from('!h',inFile.read(2))[0],struct.unpack_from('!h',inFile.read(2))[0]) # x, y coord
    nCrops = struct.unpack_from('!B',inFile.read(1))[0] #n crops
    for j in range(nCrops):
        cropId = struct.unpack_from('!B',inFile.read(1))[0] #cropId
  

Мне интересно, будет ли загрузка файла с диска в строку и синтаксический анализ строки более эффективными, чем чтение нескольких байтов за раз. Что-то вроде:

 with open(filename,'rb') as inFile:
   wholeFile = inFile.read()
  

Но я сомневаюсь, что использование объединения массивов в wholeFile будет более эффективным, чем то, что я уже делаю.

Существует ли в Python эффективный во время выполнения механизм для чтения файла в строку, а затем выполнения итерации по нему по нескольку байтов за раз? (Я проверил StringIO , и это позволяет читать только строку за раз, а не то, что я хочу в данном случае, поскольку весь файл состоит из одной строки).

Комментарии:

1. Что вы имеете в виду под efficient ? Как насчет памяти или скорости?

2. @Blender, спасибо за разъяснение, я имею в виду скорость.

3. Вы можете попробовать оба подхода. Время их: docs.python.org/library/timeit.html .

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

Ответ №1:

Комментарии:

1. Вау, это довольно круто! Модуль Python, который делает именно это!

2. @Carl: Нет. У меня были выбраны ответы из 2 символов. Может быть, даже 1-символьный ответ.