The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Раздел полезных советов: Как в Perl оптимально заменить симв..."
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Разговоры, обсуждение новостей (Public)
Изначальное сообщение [ Отслеживать ]

"Раздел полезных советов: Как в Perl оптимально заменить симв..."  +/
Сообщение от auto_tips (??) on 30-Ноя-04, 15:00 
При работе с большими строками нужно избегать внутреннего копирования строк,
которое происходит при использоании регулярных выражений или оператора split.

Для разбиеная строки вида "small_begin:big_end" на две подстроки используем:
   my $pos=index($str, ':');
   my $begin_str = substr($str, 0, $pos,"");
   # в $str остается только big_end часть, в $begin_str - "small_begin:"

Соответсвенно, для замены символов удобно использовать:
    substr(строка, начало замены, число заменяемых символов, блок на который заменяем);

URL:
Обсуждается: http://www.opennet.dev/tips/info/754.shtml

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Как в Perl оптимально заменить символы в строке или разбить ..."  +/
Сообщение от bm email(??) on 30-Ноя-04, 15:00 
А не удобнее ли использовать для замены регулярные выражения вроде:
$str =~ s/h/j/g;

Заменит во всей строке символы h на j.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Как в Perl оптимально заменить символы в строке или разбить ..."  +/
Сообщение от Игорь (??) on 02-Дек-04, 06:34 
разбить или выделить:
($str1, $str2, str3 ...) = split (":", $string);
замена:
$string =~ s/xaker/maker/g;
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Как в Perl оптимально заменить символы в строке или разбить ..."  +/
Сообщение от Maxim Chirkov email(ok) on 02-Дек-04, 09:32 
>разбить или выделить:
>($str1, $str2, str3 ...) = split (":", $string);

Господа, речь идет про исключение лишних копирований в памяти. На досуге, возмите  в качестве $string строку размером несколько Мб и посмотрите сколько будет занимать процесс perl в памяти после split и "=~" (кстати сказать, простейшие замены с совпадением размера память лишнюю не потребляют).


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Как в Perl оптимально заменить символы в строке или разбить ..."  +/
Сообщение от Игорь (??) on 03-Дек-04, 06:45 
При таких объемах это естественно.
Perl для небольших объемов расчитывался.
Выход: написать на си подпрограмму или скомпилить скрипт в бинарник
perl2bin
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Как в Perl оптимально заменить символы в строке или разбить ..."  +/
Сообщение от Maxim Chirkov email(ok) on 03-Дек-04, 10:40 
>При таких объемах это естественно.
>Perl для небольших объемов расчитывался.

Лишние копирования сильно паразитируют в циклах и для маленьких строк.

>Выход: написать на си подпрограмму

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

> или скомпилить скрипт в бинарник perl2bin

При цикличных операциях выйгрыша не будет, так как скрипт уже переведен в псевдокод.


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "Как в Perl оптимально заменить символы в строке или разбить ..."  +/
Сообщение от achmed (??) on 13-Дек-04, 15:57 
даже если писать на компилируемом языку (например Си),
скорость при использовании регулярных выражений (библиотек
много разных) будет медленнее чем при использовании
стандартных функций для работы со строками, за удовство
приходится платить скоростью.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Как в Perl оптимально заменить символы в строке или разбить ..."  +/
Сообщение от agility_member on 03-Дек-04, 09:11 
а awk или sed ?
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Речь шла про 'оптимально'"  +/
Сообщение от mic (??) on 09-Дек-04, 07:17 
Где-то недавно видел статейку на английском про оптимизацию этого процесса. Щас уже не найду, но скриптик оттуда (переделанный слегка) вот:

---------------------------------------------
#!/usr/bin/perl

my $URI = "http://www.stonehenge.com/merlyn/" .
    "Pictures/Trips/2003/03-06-PerlWhirlMacMania/" .
    "Day-0-Pearl-Harbor/?show=14";
  sub re_match {
    my $str = $URI;
    my ($scheme, $rest) = $str =~ /(.*?):(.*)/;
$ir++;
  }
  sub split_it {
    my $str = $URI;
    my ($scheme, $rest) = split /:/, $str, 2;
$is++;
  }
  sub index_substr {
    my $str = $URI;
    my $scheme = substr($str, 0, index($str, ":")-1);
    my $rest = substr($str, index($str, ":")+1);
$ii++;
  }

# Счетчик цикла
$k=1000000;
$tt = times;
for ($i=0;$i<$k;$i++) { &re_match; }
print "re_match = ",times - $tt," s.\n";

$tt = times;
for ($i=0;$i<$k;$i++) { &split_it; }
print "split_it = ",times - $tt," s.\n";

$tt = times;
for ($i=0;$i<$k;$i++) {
    &index_substr;
}
print "index_substr = ",times - $tt," s.\n";
-----------------------------------------------

Попробуйте запустить и наглядно увидите что "оптимально", а что не очень :)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "Как в Perl оптимально заменить символы в строке или разбить ..."  +/
Сообщение от tor email(??) on 14-Июн-09, 22:57 
Если добавить use strict; то результат изменится :-)
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру