Есть ли способ получить представление в python array.array ()?

Я генерирую много довольно «случайных» файлов (~ 500 МБ), в которых содержимое является результатом повторных вызовов random.randint(...) . Я хотел бы предварительно распределить большой буфер, написать longs для этого буфера и периодически сбрасывать этот буфер на диск. В настоящее время я использую array.array() но я не вижу способа создать представление в этом буфере. Мне нужно сделать это, чтобы я мог hashlib.update(...) часть буфера действительными данными в hashlib.update(...) и записать действительную часть буфера в файл. Я мог бы использовать оператор среза, но AFAICT, который создает копию буфера, чего я не хочу.

Есть ли способ сделать это, чего я не вижу?

Обновить:

Я пошел с numpy как user42005 и предложил hgomersall. К сожалению, это не дало мне ускорений, которые я искал. Моя простая в использовании программа C генерирует ~ 700 Мбайт данных в 11, а мой эквивалент python с использованием numpy занимает около 700 секунд! Трудно поверить, что это разница в производительности между ними (я скорее верю, что где-то я наивную ошибку …)

2 Solutions collect form web for “Есть ли способ получить представление в python array.array ()?”

Numpy невероятно гибкий и мощный, когда дело доходит до просмотров в массивы, одновременно сводя к минимуму копии. Например:

 import numpy a = numpy.random.randint(0, 10, size=10) b = numpy.a[3:10] 

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

Массивные массивы позволяют использовать все виды доступа непосредственно к буферам данных и могут быть тривиальными. Например:

 a = numpy.random.randint(0, 10, size=10) b = numpy.frombuffer(a.data, dtype='int8') 

b теперь просматривает память с данными, все как 8-битные целые числа (сами данные остаются неизменными, так что каждый 64-битный int теперь становится 8 8-битными ints). Эти объекты буфера (из a.data) являются стандартными объектами буфера python и поэтому могут использоваться во всех местах, которые определены для работы с буферами.

То же самое верно для многомерных массивов. Однако вы должны иметь в виду, как данные лежат в памяти. Например:

 a = numpy.random.randint(0, 10, size=(10, 10)) b = numpy.frombuffer(a[3,:].data, dtype='int8') 

будет работать, но

 b = numpy.frombuffer(a[:,3].data, dtype='int8') 

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

 b = a[:,3] 

возвращает вполне адекватный массив numpy. Тем не менее, он не является непрерывным в памяти, поскольку он представляет собой представление в другом массиве, который не должен быть (и в этом случае не является) представлением о непрерывной памяти. Вы можете получить информацию о массиве, используя атрибут flags в массиве:

 a[:,3].flags 

который возвращает (среди прочего) как C_CONTIGUOUS (C-порядок, ряд строк), так и F_CONTIGUOUS (порядок Fortran, майор столбца) как False, но

 a[3,:].flags 

возвращает их как True (в 2D-массивах, самое большее одно из них может быть истинным).

Я думаю, вы могли бы использовать numpy: http://www.numpy.org – основной тип массива в numpy по крайней мере поддерживает просмотры без копии.

  • Когда создается ссылка, а когда выделен новый блок памяти и затем копируется?
  • Python с ... как для настраиваемого менеджера контекста
  • Почему `type (x) .__ введите __ (x)` вместо `x .__ введите __ ()` в стандартный контекстный список Python?
  • ошибка python с __le__, __ge__?
  • TypeError: объект 'dict_keys' не поддерживает индексирование
  • сортировка списка кортежей в Python
  • Как назначить значение строке?
  • «pydoc -w EXPRESSIONS» не работает, но «pydoc EXPRESSIONS» делает. Зачем? (все заглавные разделы справки)
  • Python - лучший язык программирования в мире.