2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 
Сообщение14.08.2006, 21:16 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Спасибо за программы и результаты! Программы будет интересно почитать, может быть, и кто-нибудь еще что-либо добавит.

Егор писал(а):
Сравнение пар на Питоне можно записать кратко:

Можно еще кратче и проще (и намного быстрее): делать массив пар (cnt, str) (вместо (str, cnt)), и использовать встроенное сравнение. Быстрее, даже если придется создавать дополнительный список.

 Профиль  
                  
 
 
Сообщение14.08.2006, 21:53 


13/07/06
68
Сравнение языков на примере написания raytracer: http://www.ffconsultancy.com/free/ray_t ... uages.html

 Профиль  
                  
 
 Переделал сортировку пар на Питоне
Сообщение15.08.2006, 22:32 


22/06/05
164
незваный гость писал(а):
Можно еще кратче и проще (и намного быстрее): делать массив пар (cnt, str) (вместо (str, cnt)), и использовать встроенное сравнение. Быстрее, даже если придется создавать дополнительный список.

Ещё поменять знак у cnt, чтобы сортировалось по убыванию. Для небольших файлов с большим словарём время работы сократилось почти в два раза. Не думал, что окончательная сортировка пар на Питоне (с помощью переопределённой функции сравнения) была настолько долгой. Для Перла этот этап тоже долгий, но пока что оставил по-старому. На C++ встроенная сортировка пар тоже чуть быстрее, чем с помощью внешней функции сравнения, но разница не так велика. В "C++, sort" поменял, а в "C++, map" оставил по-старому.

Улучшил разбиение на слова в программах на C++ (помог вариант на Лиспе :)).

Вот немножко подправленные программы и результаты сравнения:
\begin{tabular}{|l|r|r|r|r|r|r|}
\cline{1-5}
\textbf{Input files} & Shakespeare
& Bible
& Thesaurus
& Ulysses
\\ \cline{1-5}
size (bytes) &  5582655
&  4445260
&  2801695
&  1561677
\\ \cline{1-5}
n (words) &  928012
&  793877
&  197768
&  270556
\\ \cline{1-5}
m (dict's size) &  23683
&  12876
&  34977
&  29127
\\
\cline{1-5}\hline
\textbf{Programs}
&\multicolumn{4}{|c|}{time (sec)}
& bytes & lines \\ \hline
C, TST
& 0.25
& 0.18
& 0.13
& 0.13
& 3674 & 151
\\ \hline
C, 3-way str qsort
& 0.48
& 0.36
& 0.15
& 0.16
& 4518 & 176
\\ \hline
C, qsort
& 1.00
& 0.77
& 0.24
& 0.28
& 2599 & 98
\\ \hline
CPP, map
& 1.48
& 1.00
& 0.51
& 0.56
& 1930 & 73
\\ \hline
CPP, sort
& 4.94
& 4.08
& 1.00
& 1.31
& 2116 & 79
\\ \hline
Lisp, hash
& 3.71
& 3.01
& 1.69
& 1.50
& 1171 & 35
\\ \hline
Perl, hash
& 1.77
& 1.24
& 1.28
& 1.16
& 707 & 30
\\ \hline
Perl, sort
& 3.90
& 3.09
& 1.14
& 1.48
& 771 & 34
\\ \hline
Python, dict
& 1.39
& 1.08
& 0.61
& 0.59
& 637 & 27
\\ \hline
Python, sort
& 2.49
& 1.97
& 0.60
& 0.81
& 743 & 34
\\ \hline
\end{tabular}
Два замечания по поводу 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, -), но требуется аж два раза вызывать предикат "меньше".

 Профиль  
                  
 
 
Сообщение15.08.2006, 23:07 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Егор писал(а):
Питоне - два раза

1) Python'овский словарь использует hash (а не compare).
2) Я бы не рискнул утверждать определенно, что Python ищет дважды. Текстуально — да, но оптимизация (компилятором) она и в Python оптимизация.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Я пытаюсь сделать профилирование Python'а. Некоторые результаты меня уже удивили. Например, и в случае словаря, и в случае сортировки, есть вторая сортировка по частоте и алфавиту в конце. Так вот (я использовал только Шекспира), вторая сортировка в словарном алгоритме занимает примерно в два раза больше времени, чем в сортирующем. Я раздумывал над причиной, пока не понял — в словарном случае данные сильно случайны, а сортированном много правильно упорядоченных данных.

Другие результаты более предсказуемы: например, время ввода заметно превышает время вывода (просто объем перекачиваемых данных в двадцать раз больше); построение частот в случа сортировки — заметный вычислительный процесс.
Для сортировки:
Код:
5.607s ввод и разбиение на слова
14.866s сортировка слов
7.551s построение частот слов
0.475s сортировка по частотам
0.621s вывод

Для словаря:
Код:
5.560s ввод и разбиение на слова
9.536s построения словаря
1.724s построение частот
0.991s сортировка по частотам
0.655s вывод

После сравнения ежу понятно, что оптимизировать надо построение словаря и построение частот. Понятно также, что стоит использовать словарь — он едва ли не вдвое быстрее. Оптимизировать сортировку (в сортировке) в общем нечем, там объем работы определяет время. Очевидно, что оптимизация вывода (и последней сортировки) — это ловля блох (хотя и зудит меньше).

 Профиль  
                  
 
 
Сообщение15.08.2006, 23:24 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Крохотное изменение (словарного алгоритма):
Код:
  for word in words:
    if word in d:
      d[word] += 1
    else:
      d[word] = 1

и
Код:
  pairs = [(-count, word) for (word, count) in d.iteritems()]

.iteritems() вместо .items() дает новый результат:
Код:
5.522s ввод и разбиение на слова
6.892s построения словаря
1.359s построение частот
0.974s сортировка по частотам
0.641s вывод

 Профиль  
                  
 
 
Сообщение17.08.2006, 23:16 


22/06/05
164
Во как... Теперь "Python, dict" уверенно обгоняет "C++, map". Правда, речь идёт о сравнении готовых библиотечных алгоритмов, к тому же разных (хэш и бинарное дерево), но всё же никак не ожидал таких результатов.

bugmaker писал(а):
Сравнение языков на примере написания raytracer: http://www.ffconsultancy.com/free/ray_t ... uages.html

Интересно. Правда, не могу сообразить, как перенаправить вывод в OpenGL, чтобы получились сами рисунки :? .

 Профиль  
                  
 
 
Сообщение18.08.2006, 02:06 


13/07/06
68
Цитата:
но всё же никак не ожидал таких результатов.

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

Цитата:
Правда, не могу сообразить, как перенаправить вывод в OpenGL, чтобы получились сами рисунки

Зачем перенаправлять? Я только одну прогу пробовал, http://www.ffconsultancy.com/free/ray_t ... de/ray.cpp . gqview получившийся рисунок отлично показывает. ИМХО и с остальными так же должно быть.

 Профиль  
                  
 
 
Сообщение18.08.2006, 07:02 


22/06/05
164
bugmaker писал(а):
Вполне ожидаемый результат, что самописная функция оказалась более медленной чем написанная на сях и хорошо оптимизированная библиотечная.

Меня удивило, что библиотечные STL::sort и STL::map работают медленнее, чем питоновские sort и dict. Ожидал от Питона большего торможения из-за динамической типизации.

"Ручное" выделение слов на C++ работает нормально. Небиблиотечное TST на C, которое взял почти готовым из какой-то статьи, - просто отлично (естественно, там алгоритм специально для строк).
Цитата:
Я только одну прогу пробовал, http://www.ffconsultancy.com/free/ray_t ... de/ray.cpp . gqview получившийся рисунок отлично показывает. ИМХО и с остальными так же должно быть.

Спасибо. Не сообразил, что получается обычный рисунок. :? (Там было какое-то упоминание OpenGL.)

 Профиль  
                  
 
 
Сообщение18.08.2006, 14:26 


13/07/06
68
Цитата:
Меня удивило, что библиотечные STL::sort и STL::map работают медленнее

STL ИМХО вообще добавлено "чтоб было", у него ещё полно недостатков.

Цитата:
Ожидал от Питона большего торможения из-за динамической типизации.

позднее связывание в с++ тоже штука небыстрая.

Цитата:
Не сообразил, что получается обычный рисунок.


man 1 file

 Профиль  
                  
 
 статья Бентли и Сэджвика
Сообщение28.09.2006, 13:57 


22/06/05
164
В двух тестированных программах (самых быстрых) были использованы готовые реализации TST и сортировки Бентли-Сэджвика. Забыл указать источник. Там перевод статьи Бентли и Сэджвика, дополненный текстами алгоритмов на C.

Недавно Алексей Татаринов прислал оригинал и улучшенный перевод статьи Бентли и Сэджвика.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 25 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group