Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 24, 2010 16:46:09

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

psyco замедляет?

from timeit import Timer
import re

try:
import psyco
psyco.full()
except ImportError:
print 'Psyco not installed, the program will just run slower'

str = "www.zaycev.net"
substr = "zaycev.net"
times = int(1e5)

strre=re.compile(substr, re.IGNORECASE)

def search_find():
return str.find(substr) != -1



def search_regexp():
return strre.search(str)

print "Testing find search"
print Timer(search_find).timeit(times)

print "Testing regexp search"
print Timer(search_regexp).timeit(times)


"""
1e5 iterations

no psyco
Testing find search
0.264238331967
Testing regexp search
0.713423912816

psyco
Testing find search
0.413242465174
Testing regexp search
1.04500544064
"""
WTF?



Офлайн

#2 Окт. 24, 2010 17:16:40

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

psyco замедляет?

замедляет при неверном использовании.



Офлайн

#3 Окт. 24, 2010 17:19:34

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

psyco замедляет?

А чем правильное отличается от неправильного?



Офлайн

#4 Окт. 24, 2010 21:34:54

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

psyco замедляет?

вот тут целая статья про это… http://www.ibm.com/developerworks/ru/library/l-psyco/



Офлайн

#5 Окт. 24, 2010 23:24:33

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

psyco замедляет?

asilyator, касательно вашего примера - psyco не поможет. Регулярные выражения реализованы в _re (а re - тонкая обертка сверху), который написан на С.
Ускорять там нечего - нет кода на Питоне.

Теперь про psyco вообще. Не люблю.
1. Не работает на 64 битных системах - и никогда не научится. Проект мертв.
2. Делать psyco.full() попросту нельзя - нужно находить тонкие места и указывать компиляцию только выборочных функций.
Надеюсь, вы уже научились использовать питоновский профайлер?
3. Далее. Даже зная те 3% (я не согласен с оценкой автора статьи в 10% - слишком много) кода, которые стоит оптимизировать - не уверен, что psyco лучший выход.

Я поступаю так: через dis.dis смотрю на дизассемблер байткода проблемных функций. При некоторой сноровке читается легко и дает много открытий чудных.
Кое-какая оптимизация может быть сделана в самом питоновском коде.
Например

for i in range(100):
a.b.c.f(i)
меняется на
f = a.b.c.f
for i in range(100):
f(i)
и оно сильно помогает.

Далее берем Cython (http://www.cython.org/) и переносим функцию в pyx файл. Правим, внося объявления типов где нужно. Получаем максимальную теоретически достижимую для psyco скорость.
Смотрим на результат (cython -a xx.pyx). Правим, пока не почувствуем облегчение.

Вообще говоря, оптимизация - сложная и комплексная штука. Первые шаги я описАл.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version