LINUX.ORG.RU

питон: оптимизация замены


0

0

есть около 100 шаблонов и файл около милионна строк,
как работает сейчас:
list.append(re.compile("(?P<g1>..)(?P<g2>..)"))

for i in list:
line=p.sub("\g<g1>AAA\g<g1>BBB", line)

слишком уж медленно это работает,

можно ли как-то соптемизировать и не очень увеличить длинну программы?

мысли:
хорошо бы за один раз проводить замену в line, а в цикли по всему списку паттернов.

anonymous

Как вариант (сам не пробовал):

Считать большое количество строк (можно попробовать весь файл, если с памятью нормально).

Сделать '\n'.join

Сделать все замены.

Записать результат.

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

нет, строки надо обрабатывать по отдельности,
их потом в виде xml записываю

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

упрощенная схема выглядит так <line>content</line>

anonymous
()

Если я правильно понял, ты для каждой из миллиона входных строк генерируешь 100 новых временных строк, при этом обрабатывая столько же регулярных выражений. Это не может работать быстро.

>можно ли как-то соптемизировать

При такой постановке - вряд ли. Можно попробовать не генерировать новые строки при несовпадении с regexp-ом, но вряд ли это сильно поможет.

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

>При такой постановке - вряд ли

почему?

классическая оптимизация:
цикл по строке,
если начиная с текущего совпадает с шаблоном
добавляем в новую строку измененный вариант,
нет добавляем текущей символ,
тогда не будет пересоздания строки каждый раз,

но как это сделать на питоне и можно ли я не знаю,

просто работает очень уж долго(где-то час),
может стоить думать насчет компилируемых языков,
или perl?

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

>почему

IMHO: Потому, что задача поставлена так: есть 100 регекспов ....:-) Нужно от печки начинать. re.sub довольно дорогое удовольствие.

100М цикл на питоне вероятно стоит унести куда-то в модуль - пусть покомпилится. И psyco напрячь - но в данном случае сильно помочь не должно.

Возможно поможет переписать во что-то типа комбинации(fold?) генераторов, yieldящие теги или оригинальную строку, в зависимости от условий, а результат map-ом загнать во _.write. Но красиво описать это на питоне, вероятно нелегко(тут хаскель нужен;-).

>тогда не будет пересоздания строки каждый раз

На работе смотрел - пересоздается. Дома - нет. Вероятно версии разные.

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

Уточните задачу

> нет, строки надо обрабатывать по отдельности, их потом в виде xml записываю

В первоначальном вопросе говорилось только о замене. Опишите задачу, возможно есть другой путь.

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