Было бы лучше использовать memoryview, itertools.islice или что-то еще (например, var = (start, stop)) в качестве указателя в Python на подстроку очень большой строки?
Контекст: у меня есть очень длинные строки, которыми мне нужно манипулировать (вырезать и вставлять подстроки и т. д.), Не создавая каждый раз новую строку.
Я добиваюсь этого, создавая двоичное дерево поиска, в котором каждый узел представляет подстроку, а затем использую операции разделения / слияния (структура данных Rope).
Каждому узлу требуется прикрепленная к нему ссылка на подстроку исходной очень большой строки, которую представляет узел. (Это необходимо для того, чтобы, когда я прохожу по дереву, чтобы создать окончательно отредактированную строку, я возвращал части исходной строки в измененной последовательности.)
Я мог бы прикрепить кортеж, представляющий значения запуска / остановки к каждому узлу, а затем использовать нарезку string[start:stop], но в C вы должны использовать указатель и количество символов.
Было бы лучше сделать что-то подобное в Python, либо с memoryview, либо с islice, либо с чем-нибудь еще?
Спасибо, @metatoaster, подойдет. В настоящее время я читаю тестовые файлы в память сразу и сохраняю их как строки Unicode по умолчанию в python3. Но в будущем я хотел бы иметь возможность обрабатывать большие файлы кусками.
О, если вы выполняете фактические манипуляции с текстом, читаемым человеком, это может быть сложнее, вы можете подумать об использовании ctypes напрямую, например ctypes.create_unicode_buffer, и работать непосредственно с ним.
Я бы проголосовал за memoryview здесь, если вы не против работать с байтами. itertools.islice будет эффективно использовать память, но позволит только один проход и будет медленным






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