Если Вы не хотите использовать ДОЛЛАР, Вы можете Шиканье использования (который имеет интерпретатор) , или Вы могли рассмотреть Script.NET (S#) проект на CodePlex. С решением для Шиканья можно выбрать между скомпилированными сценариями или использованием интерпретатора, и Шиканье делает хороший язык сценариев, имеет гибкий синтаксис и расширяемый язык через его открытую архитектуру компилятора. Script.NET выглядит хорошим слишком, тем не менее, и Вы могли легко расширить тот язык, а также проект с открытым исходным кодом и используете очень дружественный Генератор Компилятора ( Irony.net ).
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)
то есть вызов замены байтов условным при тесте на прямой порядок байтов.
Вы можете собрать решение на основе ASM , используя CorePy . Однако мне интересно, сможете ли вы получить достаточную производительность от какой-либо другой части вашего алгоритма. Ввод-вывод и манипуляции с фрагментами данных размером 1 ГБ займут некоторое время, каким бы способом вы их не разрезали.
Еще одна вещь, которую вы можете найти полезной, - это переключиться на C после того, как вы создали прототип алгоритма на Python. Я сделал это один раз для манипуляций с набором данных ЦМР (высота) всего мира. Когда я отказался от интерпретируемого сценария, все стало намного терпимее.
Слегка изменен Ответ @Alex Martelli :
arr = numpy.fromfile(filename, numpy.dtype('>f4'))
# no byteswap is needed regardless of endianess of the machine
Я бы ожидал, что что-то подобное будет быстрее
arrayName[0] = unpack('>'+'f'*line_count*sample_count, map.read(arrayName.itemsize*line_count*sample_count))
Пожалуйста, не используйте карту
в качестве имени переменной