Russian Qt Forum
Ноябрь 23, 2024, 10:51 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 9 10 [11] 12 13 ... 18   Вниз
  Печать  
Автор Тема: Регулярное выражение с QString  (Прочитано 161050 раз)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #150 : Июль 29, 2013, 20:40 »

Меняет способ.
Способ чего?
Можно устанавливать любые кодеки, это ничего не поменяет. Как был внутри unicode, так и остался.
А вот как произойдет конвертация в этот unicode из других кодировок и будет ли она правильная вопрос.
Записан
Majestio
Гость
« Ответ #151 : Июль 29, 2013, 20:47 »

Способ чего?
Можно устанавливать любые кодеки, это ничего не поменяет. Как был внутри unicode, так и остался.
А вот как произойдет конвертация в этот unicode из других кодировок и будет ли она правильная вопрос.
Ну как чего, способа доступа к n-му символу строки. Для строки в Unicode - символ берется по смещению = 2*порядковый_номер_символа. Для UTF-8 берется посредством последовательной предварительной индексации (см. вики). А это дополнительное время.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #152 : Июль 29, 2013, 20:56 »

Ну как чего, способа доступа к n-му символу строки. Для строки в Unicode - символ берется по смещению = 2*порядковый_номер_символа. Для UTF-8 берется посредством последовательной предварительной индексации (см. вики). А это дополнительное время.
Давайте вы сейчас посмотрите все вики и перечитаете последние посты. Вы уже не туда куда то пошли. Подмигивающий
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #153 : Июль 29, 2013, 21:18 »

Вам не кажется странным, что изменились количества слов: Улыбающийся

Old:    9578 15211
Majestio:    12047 15211


Вдогоночку ....

Изменил кодировку под win-1251 ...

Old:    8985 247
Majestio:    11593 247
Perl: 3312 15211

Ну вот кагбэ так  Строит глазки
Записан
Majestio
Гость
« Ответ #154 : Июль 29, 2013, 21:35 »

Давайте вы сейчас посмотрите все вики и перечитаете последние посты. Вы уже не туда куда то пошли. Подмигивающий

Речь зашла об этом:

Перл быстр, потому что работает с UTF8, в отличие от нас.

А это ошибочное утверждение! У Перла есть средства для работы с UTF-8, и это совсем не родная его кодировка! Но и у Qt средства тоже есть. Вопрос в их реализациях. Перл не хранит текст в UTF-8, но и не хранит в Unicode. Про его механизм хорошим доступным языком написано тут. Так что, как реализовали - так и пользуем.

Вам не кажется странным, что изменились количества слов: Улыбающийся

Ничего странного ))) Перекодировочку забыл  Строит глазки ... исправляю:

Код
C++ (Qt)
...
   QTextCodec *codec = QTextCodec::codecForName("CP-1251");
   QTextCodec::setCodecForLocale(codec);
 
   QFile in( "C:/Projects/wordstat/test.txt" );
   if( !in.open( QIODevice::ReadOnly | QIODevice::Text ) )
   {
       qWarning( "Test file not found." );
       return 1;
   }
 
   QTextStream inStream(&in);
   QString src = inStream.readAll();
...
 

Результаты:

Old:    8997 15211
Majestio:    11810 15211

Как видно, "от перемены мест слагаемых - легче не становится" )))
Записан
Majestio
Гость
« Ответ #155 : Июль 29, 2013, 21:41 »

А вот по поводу регэкспов немного расскажу (Гурам - не читать!!!)  Строит глазки

Что такое регэкспы? Регэксп - по сути реализация детерминированного конечного автомата (ДКА) для обработки массива символов. Таким образом, использование его состоит из двух фаз:

1) Непосредственное построение самого ДКА по регулярному выражению
2) Применение ДКА для обработки ваших данных

Почему приведенный мною пример на Перле быстрее? Дело не в регэкспах, а в их реализации. В Перле весь код, за исключением функции eval походит предварительную компиляцию в байт-код, потом его интерпретацию. На этой фазе предварительной компиляции, строятся и ДКА. Если не ошибаюсь, в ранних версиях Перл'а этого не было, но была функция "обучения" learn, которая и строила ДКА для множественного применения. Сейчас не получается раскопать, а старый файлец hlp-формата 97 года моя вынь не желает читать, без проверки на валидность))) Да ланна, не суть.

Что мы видим в коде на Ц++?
В середине цикла объявляется переменная локальной видимости QRegExp rx( "[\\s\\.,:;\\-()]" ), которая в каждом такте цикла строит для себя ДКА. Уверен, если ее вынести выше за цикл со 100-ми повторениями - Ц++ код станет заметно быстрее, а по "справедливости" - равным коду на Перл.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #156 : Июль 29, 2013, 21:58 »

Речь зашла об этом:
Речь зашла о том, что в Qt все строки хранятся в unicode и не зависимо от того, какие кодеки мы куда устанавливаем, в конце концов разбор идет именно юникода. Всегда.

Как видно, "от перемены мест слагаемых - легче не становится" )))
Вы живете в чудесном мире, а у меня подобное шаманство никакого эффекта не вызывает.
Хоть локаль меняй, хоть в QTextStream кодек устанавливай. Грустно, но у меня Qt работает согласно документации.
Записан
Majestio
Гость
« Ответ #157 : Июль 29, 2013, 22:03 »

Вы живете в чудесном мире, а у меня подобное шаманство никакого эффекта не вызывает.
Хоть локаль меняй, хоть в QTextStream кодек устанавливай. Грустно, но у меня Qt работает согласно документации.
Все возможно. От компиляции к компиляции цифры "пляшут". Тем не менее пример был не для этого. Я показывал соотнесение величин скоростей кода Ц++ и Перла на одной виртуальной машине в одинаковых условиях. Возможно с кодеками все именно так, как вы утверждаете. Тут спорить не хочу - значит это была случайность.  Но и "внутренности" Перла ("работает с UTF") в этом плане не совсем очевидны. По описаниям - флаги, адаптация, распозавание ... Одна вода.
« Последнее редактирование: Июль 29, 2013, 22:05 от Majestio » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #158 : Июль 30, 2013, 09:25 »

Уверен, если ее вынести выше за цикл со 100-ми повторениями - Ц++ код станет заметно быстрее, а по "справедливости" - равным коду на Перл.
Уверены? Тогда вынесите и проверьте. К сожалению особо ничего не измениться, выигрыш будет меньше 1%.
Если посмотреть тесты производительности для разных библиотек регулярных выражений, то можно увидеть, что скорости у них очень отличаются, иногда на несколько порядков. А то, что в перле используется одна из самых быстрых (если не самая быстрая) библиотека - сомнений нет. Для перла это основная функция.
Записан
Majestio
Гость
« Ответ #159 : Июль 30, 2013, 10:55 »

Уверены? Тогда вынесите и проверьте. К сожалению особо ничего не измениться, выигрыш будет меньше 1%.

В нашем случае - прирост еле заметен, гораздо меньше 1%, вы правы. Но и регэксп у нас совсем детский. Сейчас на вскидку не помню где мое добро - как-то писал на Перле конвертер слабо-структурированных текстов (нормативные акты законодательства). Приходилось делать регэкспы на страничку-две программного кода. Там это действительно было заметно.

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

На счет скорости - утверждать сложно, статистики нет. Но то, что Перл - "законодатель моды" в рег экспах (читаем, наиболее полная реализация функционала регэкспов), это - к гадалке не ходи.
Записан
Spark
Гость
« Ответ #160 : Июль 31, 2013, 17:41 »

Режим без сортировки (в порядке встречаемости) не получается. QHash все равно как то переворачивает текст. Для этого режима пришлось оформить старый код (первоначально мной предложенный). Режим необходим, но скорее для малых объемов, поэтому ничего страшного нет, но хотелось бы победить и эту проблему.
Может будут предложения, советы?
Записан
Spark
Гость
« Ответ #161 : Июль 31, 2013, 19:45 »

Пока такой код выстроил.
Вариант2:
Код
C++ (Qt)
   QHash<QString, int> frequencyHash;
   foreach (QString Item, itemList) ++frequencyHash[Item];
   itemList.removeDuplicates();
   int countItem(0);
        foreach (QString trimmedStr, itemList)
        {
            countItemFull = countItemFull + frequencyHash.value(trimmedStr);
            countItem = frequencyHash.value(trimmedStr);
            countItemString.setNum(countItem);
 
            trimmedStr = trimmedStr + "\t" + countItemString;
            frequencyList.prepend( trimmedStr );
        }
Все-ж таки пошустрее.
Посоревнуйтесь Улыбающийся.
« Последнее редактирование: Август 01, 2013, 02:39 от Spark » Записан
Spark
Гость
« Ответ #162 : Август 01, 2013, 02:42 »

Однако, Вариант2 на порядок медленней, чем основной. Вроде бы нет многократного перебора текста и нет дополнительных регеспов, но Qlist строится медленно.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #163 : Август 01, 2013, 09:35 »

Зачем Вы подсчитываете countItemFull если он известен и равен itemList.size() до removeDuplicates. Записать можно значительно короче
Код
C++ (Qt)
 
foreach (QString s, itemList)
 frequencyList.prepend(s + "\t" + QString::Number(frequencyHash[s]));
 
Это вывод слов в начальном (или обратном) порядке но без повторов. Какой в нем смысл - хз.

Посоревнуйтесь Улыбающийся.
Вам до тех соревнований еще очень далеко. Лучше подумайте как организовать 2 и более вариантов вместе (сейчас будет "страшнэ")

Ну и конечно, порция нравоучений Улыбающийся Нормально начинать с задачек типа таких
Цитировать
Написать ф-цию
int GetWordCount( const char * str );
которая возвращает число слов в строке str разделенных пробелами или табами.
Вот отсюда растут ноги. Вот это должен в первую очередь уметь программист. Однако наш колобок считает что он сможет проскочить и обойтись без всяких базовых умений. В результате он боится и всячески избегает написать свою ф-цию, класс, файл - зато охотно питается "плюшками" типа foreach, regexp и.т.п. Когда ему об этом мягко говорят - ну, в общем, видели  Улыбающийся
Записан
Spark
Гость
« Ответ #164 : Август 01, 2013, 09:52 »

Я не собирался с вами соревноваться. Я хотел, что бы вы посоревновались. Вы ведь это любите Улыбающийся.

Я работаю над собой Улыбающийся. У меня возникла проблема я ее решаю. Второй вариант проверил. Не лучше первого оказался на поверку. Сейчас испытываю третий. И т.д. Есть еще способы узнать, что лучше? Есть! Посоревнуйтесь Улыбающийся.
Но в общем то конечный результат, каким должен быть, известен. Будем искать способ решения.
Записан
Страниц: 1 ... 9 10 [11] 12 13 ... 18   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.248 секунд. Запросов: 23.