В Python 3 можно интерпретировать основную память как массив байтов или Интс или тоскует через memoryview.cast()
:Интерпретируя ByteArray как массив длинных позиций в Python 2.7
[] b=bytearray(2*8)
[] b
bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
[] m=memoryview(b).cast('L') #reinterpret as an array of unsigned longs
[] m[1]=2**64-1
[] b
bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff')
Как можно видеть, мы можем обращайтесь к bytearray
b
, как будто он содержит массив беззнаковых длин (длиной 8 байт на моей машине) с помощью memoryview
m
.
Однако в Python 2.7 memoryview
lacks метод cast
.
Таким образом, мой вопрос: есть ли возможность переинтерпретировать bytearray
как массив longs в Python 2.7?
Важно сделать это, не копируя и не выделяя больше памяти.
Времени, необходимое для чтения длинного значения с помощью T[i]
на моей машине (Python 3.4):
python list: 40ns (fastest but needs 24 bytes per element)
python array: 120ns (has to create python int-object)
memoryview of bytearray 120ns (the same as array.array)
Jean-François's solution: 6630ns (ca. 50 times slower)
Ross's solution: 120ns
К сожалению, я не был достаточно четко в моем вопросе, все дело в том, чтобы сделать это без дополнительной памяти. – ead
Не проблема, я ждал, чтобы играть с 'pack' некоторое время. Я думаю, что позже придумаю свое решение. –
добавлен метод. Не супер slick, но работает с python 2 –