Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 8, 2011 20:52:16

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

посоветуйте профайлер

пишу софт на python 3.2 с pyqt4

он многопоточный и каждый поток обращается в сеть через urllib

с недавних пор, видимо после каких-то изменений, софт стал намертво зависать в самых неожиданных местах, при работе с сетью
решил попробовать профилировать код

поиски привели меня к схеме

python3 -m cProfile -o out.pyprof start.pyw
pyprof2calltree -i out.pyprof -o my.out
kcachegrind my.out

написал тестовый скрипт

def test2():
print('test 2')

def test():
print('hello shit')
test2()

if __name__ == '__main__':
test()
в результате в kcachegrind вижу следующее: http://clip2net.com/clip/m68436/1307554700-clipj31855-72kb.png

абсолютно непонятно, что это такое, сколько времени заняла test2() и чем она была вызвана
хорошей документации не нашел, максимум такое “руководство”: http://docs.kde.org/stable/ru/kdesdk/kcachegrind/guidelines.html

Второй способ дал мне это:

python3 -m cProfile -o out.pstats start.pyw
gprof2dot -f pstats out.pstats | dot -Tpng -o out.png

http://clip2net.com/clip/m68436/1307554914-out-30kb.png

довольно информативно, но если применить это к моему многопоточному софту, получаем здоровый граф, в котором большинство функций встроено в питон, а моих личных довольно мало. и нет никакого поиска, никакого гуи - статичный png

в связи с этим вопрос - как получить хороший полный граф, который отражает запуск всех моих (а не нативных) функций от начала и до конца - в kcachegrind?

есть ли средства лучше него?

при профилировании многопоточного софта разумнее наверное завертывать в профайлер создание одного потока и его запускать?

PS вот здесь я, чтобы лучше запомнить, подробно расписал оба использованных мной способа профилирования python-скриптов - http://www.lsdeex.ru/archives/318



Офлайн

#2 Июнь 9, 2011 08:44:02

Studentik
От:
Зарегистрирован: 2009-12-26
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

посоветуйте профайлер

Игнат
есть ли средства
Может пользовать отладочные декораторы?

http://wiki.python.org/moin/PythonDecoratorLibrary#Controllable_DIY_debug



Офлайн

#3 Июнь 9, 2011 21:43:34

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

посоветуйте профайлер

Вам дебажить надо, а не профилировать по-моему.



Офлайн

#4 Июнь 10, 2011 14:58:23

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

посоветуйте профайлер

Функция test2 не видна в результатах, потому, что она и не вызывалась.
Это можно сделать явно:

import cProfile

def test2():
print('test2')

if __name__ == __main__:
cProfile.run("test2()")
Очень удобно, если код покрыт тестами, тогда их можно просто запустить с опцией profile.
А вообще, согласен с Ed



Офлайн

#5 Июнь 11, 2011 08:03:25

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

посоветуйте профайлер

вообще проблема была такая
библиотека работы с socks-прокси в urllib принимала timeout только в виде float
а если поступал не флоат - он игнорировался и брался дефолтный, который видимо стремится к бесконечности

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

вот как такое отдебажить? я юзал дебаггер только в комодо, но так толком и не разобрался как с его помощью что-то узнать



Офлайн

#6 Июнь 11, 2011 11:49:57

Studentik
От:
Зарегистрирован: 2009-12-26
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

посоветуйте профайлер

Игнат
как такое отдебажить
1) Read your code. Think.
2) Add some “print” statements.
3) goto 1)



Офлайн

#7 Июнь 11, 2011 23:11:57

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

посоветуйте профайлер

Игнат
вообще проблема была такая
библиотека работы с socks-прокси в urllib принимала timeout только в виде float
Это вам профайлер помог узнать? Расскажите как.



Офлайн

#8 Июнь 12, 2011 21:52:30

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

посоветуйте профайлер

нет, это мне помог узнать человек, портировавший эту библиотеку с 2.7 на 3.2 :)



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version