![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| MakTpaxep |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 25.11.2010 Репутация: нет Всего: нет |
Есть таблица соответствий в файле - строка-строка.
Получается хэш около 1000 элементов. Нужно заменить в исходном файле все эти строки на соответствующие (для простоты предположим что в файле просто слова). Мой код работает неприлично долго. В каждой строке исходного файла пробегает по всем ключам и если находит заменяет их.
Господа, какие есть идеи по ускорению проги? Добавлю: Файл большой, строки тоже бывают по несколько тысяч. Это сообщение отредактировал(а) MakTpaxep - 17.6.2011, 10:32 |
|||
|
||||
| Suppir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Если файл не слишком большой, то, возможно, мультистрочный поиск (по всему файлу целиком) будет быстрее. Т.е. не нужно для каждой строки перебирать библиотеку замен.
Это сообщение отредактировал(а) Suppir - 17.6.2011, 10:26 |
|||
|
||||
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 3 Всего: 10 |
Однако, судя по коду, файл полностью посещается в память?
|
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
# perl -MBenchmark=timethese -e '%h = map { $_ => "aa$_" } 1024; @data = 0..10_000; $re = join "|", keys %h; timethese ($ARGV[0], { mak => sub { foreach (@data) { foreach my $k (keys %h) { my $h = $h{$k}; s#\b$k\b#$h#g } } }, arto => sub { foreach (@data) { s#\b($re)\b#$h{$1}#go } } })' 1000
Benchmark: timing 1000 iterations of arto, mak... arto: 2 wallclock secs ( 1.82 usr + 0.01 sys = 1.83 CPU) @ 546.45/s (n=1000) mak: 14 wallclock secs (12.78 usr + 0.00 sys = 12.78 CPU) @ 78.25/s (n=1000) |
|||
|
||||
| MakTpaxep |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 25.11.2010 Репутация: нет Всего: нет |
А мысль не дурна, спасибо Только вот если найдёт слово, которого нету в хэше, то боюсь думать что он подставит. Можно как-нибудь прямо в рег вставить проверку, если вам не трудно? Я реги ещё не настолько изучил, чтобы код внутри писать (наверное самое время). Конечно, а как иначе?
Идею понял, можно просто поменять циклы местами. Но таки самая большая потеря скорости точно не здесь. Это сообщение отредактировал(а) MakTpaxep - 17.6.2011, 11:22 |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
а как его найдут?
|
|||
|
||||
| MakTpaxep |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 25.11.2010 Репутация: нет Всего: нет |
А ну да - не найдут. Это я стормозил.
А вот если вместо ($re) было бы (\w+), то было бы ещё быстрее, только тогда надо не производить замен если такого ключа нету. Это сообщение отредактировал(а) MakTpaxep - 17.6.2011, 11:38 |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
ну если вы уверены, что у вас там класс \w+, то s#\w+#$h{$&}||''#ge
|
|||
|
||||
| MakTpaxep |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 25.11.2010 Репутация: нет Всего: нет |
Спасибо огромное, я посмотрю что значат эти две палочки=)
Ещё вопрос по этому регу s#\b($re)\b#$h{$1}#go Тут ведь переменные есть, какое тогда значение имеет модификатор "o"? Я токо в рунете находил, а решил на perldoc глянуть, так нету его О_о http://perldoc.perl.org/perlre.html Это сообщение отредактировал(а) MakTpaxep - 17.6.2011, 11:54 |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
perldoc perlop на предмет Regexp Quote-Like Operators
|
|||
|
||||
| MakTpaxep |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 25.11.2010 Репутация: нет Всего: нет |
Да всё проще чем я думал=)
|
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |