40

Ответ на пост «"Программисты не умеют программировать"»19

А ведь было же золотое время, когда большие циклы оптимизировали по времени, считая сумму тактов на цикл. И количество байт (не мб!) в программах минимизировали. Но потом пришли языки высокого уровня с кучей неоптимизированных библиотек.
Как то загорелся сделать программу для составления частотного словаря на Паскале. Для него понадобилась подпрограмма сортировки, которая должна была вызываться миллионы тысячи раз. Поэтому написал "пузырёк" на ассемблере. Когда сделал, стал искать аналоги в интернете. Нашёл одну распиаренную, которая на словаре Брокгауза и Евфрона (22мб) после получаса работы ушла в себя... Моя обрабатывала этот файл около 2-3 минут(*). Связался с автором, он рассказал, что написал программу за какой-то грант. А на вопрос, какой алгоритм сортировки использовал, ответил: "А хрен его знает? Взял какую-то готовую библиотеку и использовал модуль сортировки..."

(*) Сейчас на новом железе - 22сек.
*** 1 BROK_EFR.TXW (23270 kb)

Total words in Source: 3250130

sorting...

After sorting: 20,499 sec

After FRQ-counting: 21,887 sec

SortType=0 (alphabetical)

After sort of Destination: 21,887 sec

Total words in Destination: 282033

Total time: 21,965 sec

Average Speed: 1059 kb/sec

Типичный программист

1.5K постов6.7K подписчиков

Вы смотрите срез комментариев. Показать все
7
Автор поста оценил этот комментарий

Частотный словарь - это отсортированный по количеству появлений слова в тексте набор слов? А в чём замес, что скрипт файл 22 МБ за 2 секунды обрабатывает? Кидай ссылку на этот словарь Брокгауза и Евфрона, я покажу на попсовом питоне со стандартной библиотекой обработку за 2 секунды. Без многопотока, си-скомпилированных библиотек типа numpy и всяких приблуд, которые на ходу в Си компилируют.

раскрыть ветку (20)
3
Автор поста оценил этот комментарий

У меня на стандартной дельфевой компоненте - 6,5 сек

раскрыть ветку (18)
2
Автор поста оценил этот комментарий

На средненьком ноутбуке почти уложился в 2 секунды.

Показываю 15 наиболее встречающихся слов и время выполнения. Дополнительно: железо ноута, код, размер txt-файла.

Могу в яндекс-ссылку всё разом упаковать и отправить, если нужно.

Иллюстрация к комментарию
Иллюстрация к комментарию
Иллюстрация к комментарию
Иллюстрация к комментарию
раскрыть ветку (16)
2
DELETED
Автор поста оценил этот комментарий
Лойс
0
Автор поста оценил этот комментарий

С результатом не согласен. Все частоты здесь почему-то меньше ~10%. Кроме скорости неплохо ещё и верный подсчёт иметь...
145255 в

136324 и

45828 с

42217 на

27505 к

23831 г

23710 не

21797 по

20502 из

19073 его

17372 а

17365 или

14972 от

14425 для

14169 как

13494 при

13234 что

12849 о

12511 но

12133 он

11472 у

11323 т

10745 до

10338 п

раскрыть ветку (5)
0
Автор поста оценил этот комментарий

Все частоты здесь почему-то меньше ~10%

И что в этом ошибочного?

раскрыть ветку (1)
Автор поста оценил этот комментарий

Я не учёл, что сортировка здесь регистрозависимая. Поэтому большая разница в результатах, около 10%

0
Автор поста оценил этот комментарий

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


Если у меня сложить числа для "в" и для "В" получатся те же 145 тысяч. Для компьютера слова с прописной буквы и строчной разные, поскольку кодируются разными числами и поэтому хэшируются в разные числа. Не говорилось же, для каких именно целей словарь составляется - а если, например, надо проанализировать частотность заглавных букв? Или надо определить наиболее часто встречающееся прилагательное с большой буквы?


Так а что скажете насчёт производительности - разве резонно для подобных задач использовать ассемблер?

раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Тогда понятно. я сразу сделал несколько вариантов сортировки и возможность обработки множества файлов по маске для обработки пары гигабайт текстов. Вот тут то и получился заметный выигрыш в скорости.
Usage: FrqDictW <filename/mask> [/e<New Extension>] [/s0-s4] [/c0-c2]

Source file must be in Ansi-code (Win-1251)

s0-s4 Typ of Sort (s0 - default)

c0-c1 Case Sensitive: 0=No, 1=Yes (c0 - default)

c2 DOS-866 output

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

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

страдают пользователи?
вот тебе два пользователя:
1. получил продукт сразу, но подлагивает и кое-что не умеет
2. не получил продукт, так как кодер все еще вылизывает циклы


кто из них будет счастливее?

0
Автор поста оценил этот комментарий
Иллюстрация к комментарию
0
Автор поста оценил этот комментарий

Вот мой результат, странно:

Иллюстрация к комментарию
раскрыть ветку (1)
Автор поста оценил этот комментарий

Скорость хорошая, результат - плохой. Смысл в быстрой, но ошибочной программе какой?

0
Автор поста оценил этот комментарий

Это в один поток?

раскрыть ветку (5)
2
Автор поста оценил этот комментарий

Да


Counter сравнивает слова по хэшу с имеющимися в словаре и добавляет единички к ассоциированному счётчику. Тогда посчитать сколько раз встречается каждое слово - это O(n), где n - количество слов в тексте. Вся выборка сжимается до m - количество уникальных слов в тексте. Каждому слову соответствует число, сколько раз оно встретилось - вот этот массив чисел длиной m и сортируется.


Единственно что не доработал - слова со строчной и прописной буквы считаются разными. Но это уже детали - на это ещё бы пару секунд ушло.

раскрыть ветку (4)
0
Автор поста оценил этот комментарий

Уверен, что считывать 22 мешка через f.read() целиком здравая идея, а не по 1 строке, сразу же апдейтя словарь? А сплит по пробелу не был бы быстрее?

раскрыть ветку (3)
1
Автор поста оценил этот комментарий

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

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Вот такое есть сравнение реализаций через список и генератор, отличия по времени ничтожны на больших файлах, в отличие от памяти:

Иллюстрация к комментарию
0
Автор поста оценил этот комментарий

Сплит по пробелу оставляет знаки препинания.

0
Автор поста оценил этот комментарий

Но я не убирал повторения до сортировки

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества