незваный гость писал(а):
Можно еще кратче и проще (и намного быстрее): делать массив пар (cnt, str) (вместо (str, cnt)), и использовать встроенное сравнение. Быстрее, даже если придется создавать дополнительный список.
Ещё поменять знак у cnt, чтобы сортировалось по убыванию. Для небольших файлов с большим словарём время работы сократилось почти в два раза. Не думал, что окончательная сортировка пар на Питоне (с помощью переопределённой функции сравнения) была настолько долгой. Для Перла этот этап тоже долгий, но пока что оставил по-старому. На C++ встроенная сортировка пар тоже чуть быстрее, чем с помощью внешней функции сравнения, но разница не так велика. В "C++, sort" поменял, а в "C++, map" оставил по-старому.
Улучшил разбиение на слова в программах на C++ (помог вариант на Лиспе
).
Вот немножко подправленные программы и результаты сравнения:
Два замечания по поводу C++.
1. Сравнительно долго работает "C++, sort".
2. Посмотрим на самые долгие операции в программах "C++, map" и "Python, dict":
Код:
++d[word]; (C++, d имеет тип map)
d[word] = d.get(word, 0) + 1 (Python, d имеет тип dict)
На C++ поиск осуществляется один раз, а на Питоне - два раза. Однако время работы примерно одинаковое.
Подозреваю, что обе странности объясняются использованием предиката "меньше". Чтобы сравнить две равных строки, достаточно один раз вызвать функцию strcmp (которая возвращает +, 0, -), но требуется аж два раза вызывать предикат "меньше".