![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Artemios |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
Поигрался немного с кодом. psyco неимею, поэтому убрал.
На своей машине получил:
(1,3,4,5 остались старые, номер 2 выдавал 400 с чем-то секунд, но меня ломало каждый раз его ждать и тоже убрал; 1_2, 4_2, 5_2 -- заменил структуры в нужных местах соответствующих функций на стандартное множество -- set) Вывод: set предпочтителен. Далее, самую быструю 5_2 "в лоб" переписал на pyrex (входной язык -- немного "исковерканный" Питон, предназначена для простого (и неоптимального ![]()
после его трансляции в Си и компиляции в модуль check_pyrex.so -- могу использовать в Питоне, и завершающий код:
на моей машине дал следующий результат:
Вывод: отдельную функцию сравнения переписывать на Си -- не принесет ощутимого выигрыша. Это сообщение отредактировал(а) Artemios - 9.12.2006, 06:46 -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
||||||||||
|
|||||||||||
Artemios |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
Извиняюсь, вариант 5_3_pyrex неверен, ошибся в коде check_similarity53.
Правильный вариант модуля на pyrex:
дальше, Питон без изменения и тест:
-------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
||||
|
|||||
Artemios |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
А вот такой результат получил на той же машине:
сформировав в spisok не список списков, а список множеств, и применяя к нему упрощенный вариант 1_2:
-------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
||||
|
|||||
kulibinka |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 20.11.2006 Репутация: 2 Всего: 4 |
За неимением понимания pyrex поигрался с вашими ф-ями (засунул их в psyco)
Вот результаты:
Как видно, ф-я 521 (52 с использованием psyco) работает почти в 4 раза быстрее чем моя начальная - еще лучше ![]() А не скажете насколько скорость результатов на pyrex приближается к скорости на чистом Си? Если они идентичны, то 52 с использованием psyco (у меня ф-я 1 - 20.3900001049 , эта 5.50699996948 - в 3.6 раз выше скорость) лучше чем 52 на Си (у вас ф-я 1 - 7.58109593391, а 52 на pyrex 2.39998984337 - в 3.1 раз выше скорость). А значит использование psyco дает максимальную производительность. |
||||
|
|||||
kulibinka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 20.11.2006 Репутация: 2 Всего: 4 |
Гениально. Вот то за что я так долго боролся - Artemios, ОГРОМНОЕ СПАСИБО ![]() И даже psyco только ухудшает результаты ![]() И я сомневаюсь что есть какой-либо другой ощутимо более производительный способ решения этой задачи. Это сообщение отредактировал(а) kulibinka - 9.12.2006, 16:21 |
|||
|
||||
Artemios |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
psyco, как я понимаю, оптимизирует байт-код Питона, а в No 6 его почти небудет -- builtin функции, реализованные, как и весь Питон, на Си. Кстати, по поводу реализации. Все предыдущие тесты я проводил в ОС Linux на Python 2.4. Попробовал в Windows-е для ф-й 1,3,4,5,12,42,52 и отдельно для 6: на Python 2.4 результаты примерно такие же; на Python 2.5 примерно на пол-секунды лучше прежнего работают варианты 12,42,52 (10%-15% относительного времени), а вот 6-й:
против 1-й секунды Питона 2.4, так что разработчики не обманывали, когда говорили, что 5-я версия работает быстрее.
Оптимизировать в принципе возможно, переписав всю задачу на Си. Как видим, разработчики Питона доказывают, что при грамотном программировании на низкоуровневом языке производительность можно существенно увеличить ![]()
Если один-в-один перебивать питоновский код в pyrex -- производительность модуля на pyrex особо не возрастет (каждая строчка в стиле python-а будет транслирована в гору сишного кода). Лично мне pyrex понравился, как простенький переходничок для подключения си-шных библиотек, так как в нем можно комбинировать использование и питоновских объектов, и сишных типов, и преобразования между ними. Это сообщение отредактировал(а) Artemios - 10.12.2006, 04:24 -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
||||||
|
|||||||
kulibinka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 20.11.2006 Репутация: 2 Всего: 4 |
Обрадованный возможностью настолько сильно повысить производительность не поленился поставить 5-й питон. На моих реальных данных (проверял на шингловость множество из 6000 случайных статей) его скорость равна один в один с 4-й. Возможно в 5-й сделали пооптимальнее сравнение множеств одинаковых размеров. Поэтому в нашем тестовом варианте производительность повысилась, а в моей проверке на шинглах осталась такой же. |
|||
|
||||
Artemios |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
![]() Прото работа с множеством set тем эффективнее, чем эффективнее заданы методы __hash__() для элементов множества. Пример:
Поэтому, если допустим в множестве храним отдельные символы, то возможным шагом оптимизации будет предварительное преобразование символьных объектов в числовые (например функцией ord). kulibinka, а нельзя ли здесь выложить (приаттачить к сообщению) код основной программы и несколько статей для теста? Это сообщение отредактировал(а) Artemios - 10.12.2006, 20:50 -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
|||
|
||||
Artemios |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 18 Всего: 50 |
P.S. Я тут подумал... Если атомарные объекты -- не отдельные символы, а целые строки (слова), и при дальнейшем использовании не требуется конкретного содержания строки, а важна лишь возможность их сравнивать между собой, то имеет смысл заменить слова их хэшами, и сравнивать за тем полученные целые числа (для равных строк хэши равны, для разных -- вероятность совпадения хэшей почти нулевая)
-------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
|||
|
||||
kulibinka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 191 Регистрация: 20.11.2006 Репутация: 2 Всего: 4 |
Насчет кода и статей написал Вам в личку.
А насчет создания хешей то у меня так все и реализовано (см. код). |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Python: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |