Эффективная переменная байтовой итерации над строкой в ​​Python - PullRequest
0 голосов
/ 14 апреля 2011

Я читаю большой (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 Ответ

7 голосов
/ 14 апреля 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...