АРМАДА
Делюсь: Скрипт, удаляющий строки, содержащие заданное слово
На страницу Пред.  1, 2
Новая тема Написать ответ Advanced Hosters - профессиональный хостинг
Ср Июн 22, 2011 11:37 am Start Post: Делюсь: Скрипт, удаляющий строки, содержащие заданное слово 

cyberseo + + +
Banned
Зарегистрирован: 09.11.2010
Сообщений: 84
Обратиться по нику
# Добавлено:Ср Июл 13, 2011 5:12 pmОтветить с цитатой
Yabuti писал(а):
adamant, php, недавно начал изучать :thup:


Тут ведь вот как... Сам по себе PHP - язык несложный. Тем более, что за основу взят сишный синтаксис. Изучить его за день можно.

Но знать язык и уметь на нем кодить, это не одно и то же. Во-первых, надо просто уметь создавать эффективные алгоритмы (без разницы на каком языке - хоть на русском разговорном). Во-вторых, нужно уметь создавать эффективные алгоритмы с учетом достоинств и недостатков данного конкретного языка. Первое может потребовать долгой учебы и чтения всяких книжек, а второе придет с опытом.

Чисто два примера того, как может выглядеть твой скрипт, если подойти к нему с других сторон.

То же самое, но без итератора foreach:

Код:
<?php
$clean = 'бесплат';
$source = file ( 'text.txt', FILE_IGNORE_NEW_LINES );
$cnt = 0;
function is_in($var) {
   global $clean, $cnt;
   echo ++ $cnt . ". Обработали кейворд: <font color=#392E85>$clean</font><br />\n";
   return strpos ( $var, $clean ) === false;
}
$result = array_filter ( $source, "is_in" );
file_put_contents ( 'text.txt', implode ( "\n", $result ) );
echo "===========================================<br />\n";
echo "Итого: $cnt кейвордов обработано.\n";
?>


Отличается от твоей версии, верно? Тем не менее, даже этот вариант кода не учитывает особенностей конкретного языка. А учитывать их необходимо, ибо только так можно оптимизировать код (сделать его более быстрым и компактным). Например, все необходимые операции можно сделать вообще без единого цикла, или колбэка, уместив все операции всего в одну строку:

Код:
<?php
$clean = 'бесплат';
file_put_contents ( 'text.txt', preg_replace ( '/^.*?' . preg_quote ( $clean, '/' ) . '.*\n?/m', '', file_get_contents ( 'text.txt' ) ) );
?>


Данный код делает абсолютно то же самое, что и твой - только гораздо быстрее, да и по размеру он гораздо меньше Wink

В общем, правильно тут люди сказали. Если хочешь научиться кодить (на PHP, или на чем-то другом - не важно), готовься посвятить этому годы своей жизни.

medar
Опытный
Зарегистрирован: 13.05.2006
Сообщений: 243
Обратиться по нику
# Добавлено:Ср Июл 13, 2011 6:03 pmОтветить с цитатой
Не нужно стремиться сделать код компактнее, так он труднее читается.
По поводу скорости тоже - вряд ли скрипт, юзающий регулярки, будет быстрее strpos

Yabuti
V.I.P.
Зарегистрирован: 28.11.2008
Сообщений: 16263
Contest (Сумма: 2)
Обратиться по нику
# Добавлено:Ср Июл 13, 2011 6:19 pmОтветить с цитатой
тему подняли ))
я вообще после критики Медара пошел читать его блог.
И теперь php бросил, т.к. плохо его знаю, лучше изучить другой язык, чтобы в голове не было путаницы. Качнул пакет Руби на Рельсах, Аптану, вечерами изучаю, что-то пытаюсь сделать на нем.
Нравится Руби, красивый код и не только под веб.
Медар, спасибо, что не прошел мимо, высказал реальное мнение, у меня открылись глаза :thup: Drinks or Beer
Ксен ВПС и выделенные серверы от PQCService.net с бесплатным администрированием в 7 локациях, icq: 87244588
--

cyberseo + + +
Banned
Зарегистрирован: 09.11.2010
Сообщений: 84
Обратиться по нику
# Добавлено:Ср Июл 13, 2011 7:23 pmОтветить с цитатой
medar писал(а):
Не нужно стремиться сделать код компактнее, так он труднее читается.
По поводу скорости тоже - вряд ли скрипт, юзающий регулярки, будет быстрее strpos


На самом деле, тут как бы и говорить не о чем. Во-первых, легче читается короткий код, а не длинный. В случае с простенькой однострочной регуляркой, код становится горзадо более понятным, нежели тот что с циклом, или тот, что с колбэком - тупо потому, что он на много проще и в нем меньше букоф Smile

Кстати, понятность кода и скорость его работы, чаще всего являются взаимоисключающими понятиями. Лично я считаю, что конечному пользователю плевать на читаемость моего кода, для него главное это производительность. Конечно, если речь идет о работе, а не об обучении.

Что же касается скорости работы, ты опять таки сильно заблуждаешься. Регулярка - регулярке рознь. Сложные регулярки работают медленно, зато простые (как в примере выше) - чрезвычайно быстро. Например в данном конкретном случае, однострочный код работает в 2 раза быстрее, чем версия с колбэком и в 18 раз быстрее, чем исходный скрипт с циклом.

Вот результаты бенчмарков, проведенных на моем Core2Duo 2 c 4Gb ОЗУ:
1) Версия с циклом: 18 секунд (все строки вывода промежуточных результатов через echo удалены)
2) Версия с колбэком: 2 секунды (все строки вывода промежуточных результатов через echo удалены)
3) Версия с регуляркой: 1 секунда

Тест проводился на текстовом файле весом 10,335K, содержащим 134408 (т.е. более 134K) строк.

1.
Код:
$time = time();
$clean = '/78/';             
$source = file('text.txt');
$buff = fopen('text.txt','w+');
$i = 1;
foreach($source as $clean)
{
  if(strpos($clean,$sample)===false) fwrite($buff,$clean);
  $i++;
}
$i--;
fclose($buff);
echo time() - $time;


2.
Код:
$time = time();
$clean = '/78/';
$source = file ( 'text.txt', FILE_IGNORE_NEW_LINES );
$cnt = 0;
function is_in($var) {
   global $clean, $cnt;
   return strpos ( $var, $clean ) === false;
}
$result = array_filter ( $source, "is_in" );
file_put_contents ( 'text.txt', implode ( "\n", $result ) );
echo time() - $time;


3.
Код:
$time = time();
$keyword = preg_quote ( '/78/', '/' );
file_put_contents ( 'text.txt', preg_replace ( '/^.*?' . $keyword . '.*\n?/m', '', file_get_contents ( 'text.txt' ) ) );
echo time() - $time;



IMHO результаты говорят сами за себя Wink

exolon
V.I.P.
Зарегистрирован: 22.11.2007
Сообщений: 2397
Обратиться по нику
# Добавлено:Ср Июл 13, 2011 7:36 pmОтветить с цитатой
Yabuti писал(а):
И теперь php бросил, т.к. плохо его знаю, лучше изучить другой язык, чтобы в голове не было путаницы.

Взаимоисключающие параграфы. Недоучив один браться за другой. Так только путаница и останется.

cyberseo, бенчмарк шикарен. Но тебе ничего не смущает в первом варианте??? Ну хотя бы что такое $sample и откуда оно взялось....

Editeur
Опытный
Зарегистрирован: 19.06.2010
Сообщений: 382
Обратиться по нику
# Добавлено:Ср Июл 13, 2011 8:14 pmОтветить с цитатой
Вы в своих бенчмарках скорее всего эффективность драйвера дискового кэша измеряете
BossTDS - Система распределения траффика | demo BossTDS

BVz
V.I.P.
Зарегистрирован: 21.07.2009
Сообщений: 2111
Обратиться по нику
# Добавлено:Ср Июл 13, 2011 8:26 pmОтветить с цитатой
RoR намного сложнее php, вообще если освоишь любой популярный язык - проблем с освоением других не будет. PHP легче будет освоить хотя бы из-за огромного кол-ва фреймворков и готовых библиотек: flourish, CI, kohana...

Я сейчас углубленно изучаю C#, так как после его освоения можно написать что угодно, без ограничений Smile Также изучая C#, легче усваивается ООП.
Код понятнее php и других языков веб-программирования.
Качественные SEO и SMO услуги для ваших зарубежных проектов!

cyberseo + + +
Banned
Зарегистрирован: 09.11.2010
Сообщений: 84
Обратиться по нику
# Добавлено:Ср Июл 13, 2011 8:37 pmОтветить с цитатой
На самом деле, там много факторов. Если интересно, могу расписать что и почему работает быстрее на самом низком машинном уровне.

exolon писал(а):
cyberseo, бенчмарк шикарен. Но тебе ничего не смущает в первом варианте??? Ну хотя бы что такое $sample и откуда оно взялось....


Гы, ну вообще да Smile Косяк там у ТС-а, а я - старый пень и не проверил его код на адекватность - срабатывает и ладно, а что там в выдаче - х.з Smile В любом случае, даже если его код поправить и заменить $clean = 'бесплат'; на $sample = 'бесплат'; - код все равно турбореактивным не станет (3-4 секунды у меня выполняется). Собственно, проверять надо на более тяжелых файлах, ибо 10Мб это маловато в плане погрешности. Та же однострочная версия срабатывает за секунду в очень грубом приближении - в половине случаев результат вообще 0 секунд. Т.е. там может быть как 1.2, так, например, и 0.5 секунды.

cyberseo + + +
Banned
Зарегистрирован: 09.11.2010
Сообщений: 84
Обратиться по нику
# Добавлено:Ср Июл 13, 2011 8:41 pmОтветить с цитатой
BVz писал(а):
Я сейчас углубленно изучаю C#, так как после его освоения можно написать что угодно, без ограничений Smile Также изучая C#, легче усваивается ООП.
Код понятнее php и других языков веб-программирования.


Та же Java на самом деле. Только в профиль Wink

А вот насчет "написать что угодно, без ограничений" я таки не согласен. У каждой платформы есть свои задачи. Не будешь же ты скрипты для авмчегов на нем писать (плагины те же и т.д.)

З.Ы. С C# познакомился еще тогда, когда .Net имел кодовое название Lightning и передавался сотрудничающим девелоперам исключительно как microsoft confidential под NDA (подписка о неразглашении). Честно говоря, какого-то будущего вне платформы .Net, т.е. microsoft windows, я для C# не вижу.

Editeur
Опытный
Зарегистрирован: 19.06.2010
Сообщений: 382
Обратиться по нику
# Добавлено:Ср Июл 13, 2011 8:53 pmОтветить с цитатой
Цитата:
что и почему работает быстрее на самом низком машинном уровне.


Если ты запускаешь свои тесты без перезагрузки, то после первого теста файл будет сидеть в кэше. Разница в 9-18 раз скорее всего из-за этого.
Ну и самое медленное в этих тестах чтение построчно из файла.
BossTDS - Система распределения траффика | demo BossTDS

medar
Опытный
Зарегистрирован: 13.05.2006
Сообщений: 243
Обратиться по нику
# Добавлено:Ср Июл 13, 2011 8:54 pmОтветить с цитатой
cyberseo писал(а):
На самом деле, тут как бы и говорить не о чем. Во-первых, легче читается короткий код, а не длинный. В случае с простенькой однострочной регуляркой, код становится горзадо более понятным, нежели тот что с циклом, или тот, что с колбэком - тупо потому, что он на много проще и в нем меньше букоф Smile

Кстати, понятность кода и скорость его работы, чаще всего являются взаимоисключающими понятиями. Лично я считаю, что конечному пользователю плевать на читаемость моего кода, для него главное это производительность. Конечно, если речь идет о работе, а не об обучении.



Конечный пользователь не смотрит код, а вот когда работаешь в команде или сам через год-два смотришь в свой код с мыслями "а что вообще делает вот этот кусок?" - вот тогда понимаешь, зачем оно надо.
Перл во многом погубило то, что это write-only язык - программист через полчаса забывал, что это у него там такое написано однострочное, так как перл очень провоцировал на такое Smile

То, что колбэк быстрее - это было понятно, но то, что простая регулярка выигрывает у strpos - это гуд ньюс Smile

Цитата:
И теперь php бросил, т.к. плохо его знаю, лучше изучить другой язык, чтобы в голове не было путаницы. Качнул пакет Руби на Рельсах, Аптану, вечерами изучаю, что-то пытаюсь сделать на нем.
Нравится Руби, красивый код и не только под веб.



"Картошку хотя бы затем любить следует, что она ум развивает" (с) Чапаев. Весьма кардинальный поворот но я в целом одобряю Smile Рельсы приучат к тому, как должно быть устроенным современное веб-приложение, после них и на php-фреймворках можно будет быстро научиться писать. Правда, скрипты писать будет некому, так как руби из вебмастеров никто не знает Smile

cyberseo + + +
Banned
Зарегистрирован: 09.11.2010
Сообщений: 84
Обратиться по нику
# Добавлено:Ср Июл 13, 2011 9:03 pmОтветить с цитатой
Тут дело не в том, что простая регулярка выигрывает у strpos. Кончено же strpos чуть быстрее (на самом деле именно чуть), чем простая регулярка. Весь фокус в том, что в данном случае, регулярка работает со всем текстом целиком, а strpos приходится выполнять для каждой строки, а это:
1) дополнительный вызов команд call и ret с занесением параметров на стек и последующим снятием/обработкой оных (не говоря о сохранении/восстановлении регистров процессора);
2) дополнительная инициализация локальных параметров функции (тот же счетчик и т.д.);
3) лишнее обращение к диску (построчная/блоковая запись осуществляется гораздо медленнее, чем непрерывная).

Все это делает версию с циклами и strpos более медленной, по сравнению с вызовом простой регулярки.

exolon
V.I.P.
Зарегистрирован: 22.11.2007
Сообщений: 2397
Обратиться по нику
# Добавлено:Ср Июл 13, 2011 9:13 pmОтветить с цитатой
Имхо, в случае регулярки целый текст подается на вход сишной либе, внутри которой и бежит цикл с соответствующей скоростью. Ну а цикл в php со всеми динамическими приколами будет проигрывать по скорости. Ну как-то так.

cyberseo + + +
Banned
Зарегистрирован: 09.11.2010
Сообщений: 84
Обратиться по нику
# Добавлено:Ср Июл 13, 2011 9:17 pmОтветить с цитатой
Угумс.

ctapbiu
Опытный
Зарегистрирован: 06.01.2008
Сообщений: 328
Обратиться по нику
# Добавлено:Ср Июл 13, 2011 9:53 pmОтветить с цитатой
Димитрий, загоняешь в массивы и сравниваешь их между собой
Код:

<?php
$words1 = preg_split('#[\r\n]+#', file_get_contents('file1.txt'));
$words2 = preg_split('#[\r\n]+#', file_get_contents('file2.txt'));
$res = array_diff($words2, $words1);

$fp = fopen('res.txt', 'w');
fwrite($fp, join("\n", $words2));
fclose($fp);
?>



ЗЫ: код писал прям здесь, не тестил
Новая тема Написать ответ    ГЛАВНАЯ ~ ТЕХНИЧЕСКИЕ ВОПРОСЫ

Перейти:  





Генеральный спонсор



Партнеры