LINUX.ORG.RU

операция slice в питоне копирует подстроку

 , ,


0

3

http://svn.python.org/projects/python/trunk/Objects/stringobject.c

Если размер подстроки в диапазоне 2..n-1, то string_slice вызывает PyString_FromStringAndSize, которая копирует подстроку полностью.

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

<caps>И нахера тогда вообще этот питон эти строки?</caps> в чем преимущество? Разве что проще освобождать память от отдельных подстрок? Но в моем кейсе это вроде не нужно.

http://svn.python.org

svn

Как ты думаешь, какого года эти сырцы? Хинт: много лет назад они перешли на hg и год назад на git.

По поводу строк, уверен, вопрос раскрыт в гугле. Что касается memoryview то он у меня работал заметно медленнее обычных строк (раза в два что-ли, померяй). Единственное, он память экономит.

Разве что проще освобождать память от отдельных подстрок?

В инете периодически пролетают всякие «продвинутые» структуры данных на питоне, в том числе на тему строк. Но я бы сначала убедился что это поможет. Питон в принципе небыстрый ЯП и не всегда низкоуровневые операции приносят общий прирост производительности.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Как ты думаешь, какого года эти сырцы?

тут то же самое: https://hg.python.org/cpython/file/v2.7.11/Objects/stringobject.c

Питон в принципе небыстрый ЯП и не всегда низкоуровневые операции приносят общий прирост производительности

Мне бы память сэкономить хоть.. С питоновской реализацией будет квадратичный рост памяти, против линейного роста, который можно получить. Не хочу копировать сотни слайсов из гигабайтных строк

MyTrooName ★★★★★ ()
Ответ на: комментарий от true_admin

По поводу строк, уверен, вопрос раскрыт в гугле.

Подкинь пару ссылочек плз? Гуглеж по «alternative python string library», "[re]implementation", «fast slice» ничего не дал.

Видимо, все довольны тем, что есть.

MyTrooName ★★★★★ ()
Ответ на: комментарий от MyTrooName

Мне бы память сэкономить хоть

Тогда memoryview.

На счёт альтернативных реализаций, я, возможно, немного погорячился. Но в плане хранения данных есть просто куча несколько разных фреймворков со своей реализацией массивов (тебе именно строки нужны или bytes?). Навскидку: pandas, numpy и вообще любой приличный научный фреймворк.

true_admin ★★★★★ ()
Ответ на: комментарий от MyTrooName

А ты почитай тут:

https://hg.python.org/cpython/file/3.5/Objects/unicodeobject.c

и тут:

https://hg.python.org/cpython/file/3.5/Objects/sliceobject.c

я там ни фига не понимаю, правда, но кажется, что всё уже оптимизировано. Можно тесты погонять.

proud_anon ★★★★★ ()
Последнее исправление: proud_anon (всего исправлений: 1)

Нифига себе. Всю жизнь был уверен, что там легковесные слайсы, а тут такое.

HeipaVai1o ()
Ответ на: комментарий от true_admin

memoryview

Вроде бы прекрасен, но придется велосипедить всякие find() итп. Хотя так и так придется, так что все равно свою обертку писать

тебе именно строки нужны или bytes?

Таки наверное bytes. Скорее всего. Наверное.

Пока речь идет о bytes. С принципиальной точки зрения, что для bytes, что для unicode, проблема одна и та же.

MyTrooName ★★★★★ ()
Ответ на: комментарий от MyTrooName

придется велосипедить всякие find()

У него есть .tobytes(), но сколько это памяти займёт я хз :). Есть ещё модуль array, как он работает хз. Причём, в третьем питоне плюшек больше.

Но всё же я бы посмотрел numpy или pandas. Для numpy.array пишут что оно работает так как тебе нужно. И пишут что там свои грабли.

true_admin ★★★★★ ()

вообще-то как бэ строки в python это immutable, хочешь скорости - пиши на C

anonymous ()
Ответ на: комментарий от anonymous

Ну так потому и должны быть легковесные слайсы, что immutable.

anonymous ()
Ответ на: комментарий от true_admin

Кстати, да, в numpy дешёвые слайсы как раз есть. Но там не строки, а массивы же, find() там тоже нет.

anonymous ()
Ответ на: комментарий от anonymous

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

xpahos ★★★★★ ()

Еще можно попробовать посмотреть как делают lazy split, но он делается через итераторы(если память не изменяет) и сделать ему find будет затратно.

xpahos ★★★★★ ()

для такого slice'а нужно все строковые методы переписывать, ведь он не будет null-terminated

ei-grad ★★★★★ ()
Ответ на: комментарий от MyTrooName

откуда у тебя эти гигабайтные строки?.. какую задачу решаешь? 90% что делаешь что-то не то

ei-grad ★★★★★ ()

вот что нашел, буду посмотреть:

https://sourceforge.net/projects/pyropes/

судя по дескрипшну, там быстрые слайсы, конкатенация и даже операция повторения, всё на С

MyTrooName ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.