Проверка документации по Memoryview:
Объекты Memoryview позволяют коду Python получать доступ к внутренним данным
объект, поддерживающий протокол буфера без копирования.
класс memoryview(obj)
Создать представление памяти, ссылающееся на объект obj должен поддерживать
протокол буфера. Встроенные объекты, поддерживающие протокол буфера
, включают байты и bytearray.
Затем нам предоставляется пример кода:< /p>
>>> v = memoryview(b'abcefg')
>>> v[1]
98
>>> v[-1]
103
>>> v[1:4]
>>> 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 "", line 1, in
AttributeError: 'memoryview' object has no attribute 'startswith'
>>> bytes(vsub).startswith(b'bytes')
True
>>>
Итак, что я понял из вышесказанного:
Мы создаем объект MemoryView. чтобы раскрыть внутренние данные буферного объекта без
копирования, однако, чтобы сделать что-нибудь полезное с объектом (путем вызова методов,
предоставляемых объектом), нам необходимо создать копию!< /p>
Обычно просмотр памяти (или старый объект буфера) понадобится, когда у нас большой объект,
и фрагменты тоже могут быть большими. Потребность в большей эффективности будет присутствовать
если мы будем делать большие срезы или делать маленькие срезы, но большое количество раз.
При использовании приведенной выше схемы , я не понимаю, чем это может быть полезно в любой ситуации, если только
кто-нибудь не объяснит мне, чего мне здесь не хватает.
Edit1:
У нас есть большой кусок данных, мы хотим обработать их, проходя по ним от начала до
конца, например, извлекая токены из начала строкового буфера до тех пор, пока буфер не будет использован. В терминах C это продвижение указателя через буфер , и указатель можно передать
любой функции, ожидающей тип буфера. Как можно сделать что-то подобное в Python?
Люди предлагают обходные пути, например, многие строковые и регулярные функции принимают позиционные
аргументы, которые можно использовать для эмуляции продвижения указатель. С этим есть две проблемы: во-первых,
это обходной путь, вы вынуждены изменить свой стиль кодирования, чтобы преодолеть недостатки, и
во-вторых: не все функции имеют аргументы позиции, например, функции регулярных выражений и начинается с do, encode()/decode() нет.
Другие могут предложить загружать данные порциями или обрабатывать буфер небольшими
сегментами, размер которых превышает максимальный размер токена. Хорошо, мы знаем об этих возможных
обходных путях, но мы должны работать в Python более естественным образом, не пытаясь
подстроить стиль кодирования под язык - не так ли? p>
Edit2:
Пример кода прояснит ситуацию. Это то, что я хочу сделать, и то, что, как я предполагал, на первый взгляд, Memoryview позволит мне сделать. Давайте использовать 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
Подробнее здесь: https://stackoverflow.com/questions/186 ... -in-python
В чем именно заключается смысл просмотра памяти в Python? ⇐ Python
Программы на Python
-
Anonymous
1732816924
Anonymous
[b]Проверка документации по Memoryview:[/b]
Объекты Memoryview позволяют коду Python получать доступ к внутренним данным
объект, поддерживающий протокол буфера без копирования.
класс [b]memoryview[/b](obj)
Создать представление памяти, ссылающееся на объект obj должен поддерживать
протокол буфера. Встроенные объекты, поддерживающие протокол буфера
, включают байты и bytearray.
Затем нам предоставляется пример кода:< /p>
>>> v = memoryview(b'abcefg')
>>> v[1]
98
>>> v[-1]
103
>>> v[1:4]
>>> bytes(v[1:4])
b'bce'
[b]Цитата окончена, теперь давайте посмотрим поближе:[/b]
>>> 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 "", line 1, in
AttributeError: 'memoryview' object has no attribute 'startswith'
>>> bytes(vsub).startswith(b'bytes')
True
>>>
[b]Итак, что я понял из вышесказанного:[/b]
Мы создаем объект MemoryView. чтобы раскрыть внутренние данные буферного объекта без
копирования, однако, чтобы сделать что-нибудь полезное с объектом (путем вызова методов,
предоставляемых объектом), нам необходимо создать копию!< /p>
Обычно просмотр памяти (или старый объект буфера) понадобится, когда у нас большой объект,
и фрагменты тоже могут быть большими. Потребность в большей эффективности будет присутствовать
если мы будем делать большие срезы или делать маленькие срезы, но большое количество раз.
При использовании приведенной выше схемы , я не понимаю, чем это может быть полезно в любой ситуации, если только
кто-нибудь не объяснит мне, чего мне здесь не хватает.
[b] Edit1:[/b]
У нас есть большой кусок данных, мы хотим обработать их, проходя по ним от начала до
конца, например, извлекая токены из начала строкового буфера до тех пор, пока буфер не будет использован. В терминах C это продвижение указателя через буфер , и указатель можно передать
любой функции, ожидающей тип буфера. Как можно сделать что-то подобное в Python?
Люди предлагают обходные пути, например, многие строковые и регулярные функции принимают позиционные
аргументы, которые можно использовать для эмуляции продвижения указатель. С этим есть две проблемы: во-первых,
это обходной путь, вы вынуждены изменить свой стиль кодирования, чтобы преодолеть недостатки, и
во-вторых: не все функции имеют аргументы позиции, например, функции регулярных выражений и начинается с do, encode()/decode() нет.
Другие могут предложить загружать данные порциями или обрабатывать буфер небольшими
сегментами, размер которых превышает максимальный размер токена. Хорошо, мы знаем об этих возможных
обходных путях, но мы должны работать в Python более естественным образом, не пытаясь
подстроить стиль кодирования под язык - не так ли? p>
[b]Edit2:[/b]
Пример кода прояснит ситуацию. Это то, что я хочу сделать, и то, что, как я предполагал, на первый взгляд, Memoryview позволит мне сделать. Давайте использовать 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
Подробнее здесь: [url]https://stackoverflow.com/questions/18655648/what-exactly-is-the-point-of-memoryview-in-python[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия