Файл Python Хлебает w/преобразование порядка байтов

Если Вы не хотите использовать ДОЛЛАР, Вы можете Шиканье использования (который имеет интерпретатор) , или Вы могли рассмотреть Script.NET (S#) проект на CodePlex. С решением для Шиканья можно выбрать между скомпилированными сценариями или использованием интерпретатора, и Шиканье делает хороший язык сценариев, имеет гибкий синтаксис и расширяемый язык через его открытую архитектуру компилятора. Script.NET выглядит хорошим слишком, тем не менее, и Вы могли легко расширить тот язык, а также проект с открытым исходным кодом и используете очень дружественный Генератор Компилятора ( Irony.net ).

5
задан Community 23 May 2017 в 10:33
поделиться

4 ответа

with open(fileName, "rb") as f:
  arrayName = numpy.fromfile(f, numpy.float32)
arrayName.byteswap(True)

Довольно сложно превзойти по скорости И лаконичности ;-). Для обмена байтами см. здесь (аргумент True означает «сделать это на месте»); для fromfile см. здесь .

Это работает так же, как и на машинах с прямым порядком байтов (поскольку данные имеют обратный порядок байтов, требуется замена байтов). Вы можете проверить, так ли это, чтобы выполнить замену байтов условно, изменив последнюю строку с безусловного вызова на замену байтов, например, на:

if struct.pack('=f', 2.3) == struct.pack('<f', 2.3):
  arrayName.byteswap(True)

то есть вызов замены байтов условным при тесте на прямой порядок байтов.

6
ответ дан 18 December 2019 в 14:48
поделиться

Вы можете собрать решение на основе ASM , используя CorePy . Однако мне интересно, сможете ли вы получить достаточную производительность от какой-либо другой части вашего алгоритма. Ввод-вывод и манипуляции с фрагментами данных размером 1 ГБ займут некоторое время, каким бы способом вы их не разрезали.

Еще одна вещь, которую вы можете найти полезной, - это переключиться на C после того, как вы создали прототип алгоритма на Python. Я сделал это один раз для манипуляций с набором данных ЦМР (высота) всего мира. Когда я отказался от интерпретируемого сценария, все стало намного терпимее.

0
ответ дан 18 December 2019 в 14:48
поделиться

Слегка изменен Ответ @Alex Martelli :

arr = numpy.fromfile(filename, numpy.dtype('>f4'))
# no byteswap is needed regardless of endianess of the machine
7
ответ дан 18 December 2019 в 14:48
поделиться

Я бы ожидал, что что-то подобное будет быстрее

arrayName[0] = unpack('>'+'f'*line_count*sample_count, map.read(arrayName.itemsize*line_count*sample_count))

Пожалуйста, не используйте карту в качестве имени переменной

0
ответ дан 18 December 2019 в 14:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: