Указатель на подстроку Python: memoryview vs itertools.islice vs…?

Было бы лучше использовать memoryview, itertools.islice или что-то еще (например, var = (start, stop)) в качестве указателя в Python на подстроку очень большой строки?

Контекст: у меня есть очень длинные строки, которыми мне нужно манипулировать (вырезать и вставлять подстроки и т. д.), Не создавая каждый раз новую строку.

Я добиваюсь этого, создавая двоичное дерево поиска, в котором каждый узел представляет подстроку, а затем использую операции разделения / слияния (структура данных Rope).

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

Я мог бы прикрепить кортеж, представляющий значения запуска / остановки к каждому узлу, а затем использовать нарезку string[start:stop], но в C вы должны использовать указатель и количество символов.

Было бы лучше сделать что-то подобное в Python, либо с memoryview, либо с islice, либо с чем-нибудь еще?

Как вы загрузили строку в память? Если это из файловой системы, вы можете посмотреть mmap

metatoaster 28.05.2018 02:12

Спасибо, @metatoaster, подойдет. В настоящее время я читаю тестовые файлы в память сразу и сохраняю их как строки Unicode по умолчанию в python3. Но в будущем я хотел бы иметь возможность обрабатывать большие файлы кусками.

curlew77 28.05.2018 02:15

О, если вы выполняете фактические манипуляции с текстом, читаемым человеком, это может быть сложнее, вы можете подумать об использовании ctypes напрямую, например ctypes.create_unicode_buffer, и работать непосредственно с ним.

metatoaster 28.05.2018 02:47

Я бы проголосовал за memoryview здесь, если вы не против работать с байтами. itertools.islice будет эффективно использовать память, но позволит только один проход и будет медленным

juanpa.arrivillaga 15.11.2018 00:47
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
259
1

Ответы 1

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

Из перечисленных вами опций memoryview - единственная, которая не создает дополнительную копию в памяти. См. Вопрос это для получения дополнительной информации, а также ответ, который включает пример того, где memoryview может быть полезен. Хотя это может ускорить некоторые операции, как в случае примера, могут быть более эффективные способы решения проблемы или структурирования кода, устраняющие необходимость начинать. Конечно, ваш вариант использования и пробег могут отличаться.

Я также нашел несколько ссылок, в которых говорится о файлах отображенная память (mmap) и интерфейсах память (буфер в py2). Если в конечном итоге вам понадобятся указатели с нулевым копированием, я определенно рекомендую проверить интерфейс memoryview.

Другие вопросы по теме