Найти - Пользователи
Полная версия: посоветуйте профайлер
Начало » Инструментальные средства разработки » посоветуйте профайлер
1
Игнат
пишу софт на 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
Studentik
Игнат
есть ли средства
Может пользовать отладочные декораторы?

http://wiki.python.org/moin/PythonDecoratorLibrary#Controllable_DIY_debug
Ed
Вам дебажить надо, а не профилировать по-моему.
ZAN
Функция test2 не видна в результатах, потому, что она и не вызывалась.
Это можно сделать явно:
import cProfile

def test2():
print('test2')

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

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

вот как такое отдебажить? я юзал дебаггер только в комодо, но так толком и не разобрался как с его помощью что-то узнать
Studentik
Игнат
как такое отдебажить
1) Read your code. Think.
2) Add some “print” statements.
3) goto 1)
Ed
Игнат
вообще проблема была такая
библиотека работы с socks-прокси в urllib принимала timeout только в виде float
Это вам профайлер помог узнать? Расскажите как.
Игнат
нет, это мне помог узнать человек, портировавший эту библиотеку с 2.7 на 3.2 :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB