Проверка документации по памяти:
объекты memoryview позволяют коду Python получать доступ к внутренним данным объект, который поддерживает буферный протокол без копирования.
класс memoryview (obj)
Создайте представление памяти, которое ссылается на obj. obj должен поддерживать буферный протокол. Встроенные объекты, поддерживающие буферный протокол включают байты и bytearray.
Затем нам предоставляется пример кода:
>>> v = memoryview(b'abcefg')
>>> v[1]
98
>>> v[-1]
103
>>> v[1:4]
<memory at 0x7f3ddc9f4350>
>>> bytes(v[1:4])
b'bce'
Цитата, теперь давайте поближе рассмотрим:
>>> b = b'long bytes stream'
>>> b.startswith(b'long')
True
>>> v = memoryview(b)
>>> vsub = v[5:]
>>> vsub.startswith(b'bytes')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'memoryview' object has no attribute 'startswith'
>>> bytes(vsub).startswith(b'bytes')
True
>>>
Итак, что я вижу из вышеперечисленного:
Мы создаем объект memoryview для отображения внутренних данных объекта буфера без копирование, однако, для того, чтобы делать что-либо полезное с объектом (путем вызова методов предоставляемый объектом), мы должны создать копию!
Обычно память (или старый буферный объект) понадобится, когда у нас есть большой объект, и срезы также могут быть большими. Потребность в лучшей эффективности будет присутствовать если мы делаем большие ломтики или делаем небольшие кусочки, но много раз.
С приведенной выше схемой я не вижу, как это может быть полезно для любой ситуации, если только кто-то может объяснить мне, что мне здесь не хватает.
Edit1:
У нас есть большой кусок данных, мы хотим его обработать, продвигая его от начала до конец, например, извлечение токенов с начала буфера строки до тех пор, пока буфер не будет потреблен. В термине C это продвигает указатель через буфер, и указатель может быть передан к любой функции, ожидающей тип буфера. Как можно что-то подобное сделать в python?
Люди предлагают обходные пути, например, многие функции строк и регулярных выражений занимают позицию
аргументы, которые могут использоваться для подражания продвижению указателя. В этом есть две проблемы: первая
это работа, вы вынуждены изменить свой стиль кодирования, чтобы преодолеть недостатки, и
second: не все функции имеют аргументы позиции, например, функции регулярных выражений и startswith
do, encode()
/decode()
do not.
Другие могут предлагать загружать данные в куски или обрабатывать буфер в небольших сегментов, превышающих максимальный токен. Хорошо, поэтому мы знаем об этих возможностях обходные пути, но мы должны работать более естественным образом в python без пытаясь согнуть стиль кодирования, чтобы он соответствовал языку - не так ли?
Edit2:
Образец кода упростит ситуацию. Это то, что я хочу сделать, и то, что я предположил, будет иметь вид памяти, позволит мне сделать на первый взгляд. Позволяет использовать pmview (правильный вид памяти) для функциональности, которую я ищу:
tokens = []
xlarge_str = get_string()
xlarge_str_view = pmview(xlarge_str)
while True:
token = get_token(xlarge_str_view)
if token:
xlarge_str_view = xlarge_str_view.vslice(len(token))
# vslice: view slice: default stop paramter at end of buffer
tokens.append(token)
else:
break