Статистический профилировщик для PyPy

Я хотел бы использовать statprof.py для профилирования кода в PyPy. К сожалению, он не работает, номера строк, на которые он указывает, отключены. Кто-нибудь знает, как заставить его работать или знает альтернативу?


person Ecir Hana    schedule 27.06.2013    source источник
comment
Это может быть полезно   -  person Aseem Bansal    schedule 27.06.2013
comment
@zel спасибо, но меня особенно интересует PyPy.   -  person Ecir Hana    schedule 27.06.2013


Ответы (1)


Вполне вероятно, что «номера строк отключены», потому что PyPy в JIT-коде будет встраивать многие функции и будет доставлять сигналы (здесь от таймера) только в конце циклов. Сравните это с CPython, который доставляет сигналы между двумя случайными байт-кодами — иногда и в конце цикла, но обычно где угодно. Итак, то, что вы получаете в PyPy, такое же, как и в CPython, если бы вы ограничили обработчики сигналов запускаться только в байт-коде «конец цикла».

Вот почему такой вид профилирования всегда пропускает множество функций, как и большинство функций без циклов.

Вы можете попробовать использовать встроенный модуль cProfile. Это, конечно, приводит к большему снижению производительности, чем статистическое профилирование, но все же попробуйте — например, это не мешает JITting, поэтому снижение производительности все равно должно быть разумным.

В более общем плане я не вижу простого способа реализовать аналог статистического профилирования в PyPy. Довольно сложно придать смысл при наличии функций, которые встраиваются друг в друга, а затем глобально оптимизируются... Мне было бы интересно, если бы вы могли обнаружить, что на самом деле существует инструмент для какого-то другого языка высокого уровня, выполняющий статистические профилирование на виртуальной машине с трассировкой JIT.

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

person Armin Rigo    schedule 27.06.2013
comment
Спасибо за подробный ответ. Я пробовал cProfile раньше, но он записывает только вызовы функций, т.е. невозможно сказать, какая часть (строка) функции потребляет время. Мне действительно не нужно использовать статистическое профилирование, если я могу найти узкое место с большей точностью, чем какая-либо функция. Я знаю, что есть также lineprofiler/kernproof, но я думаю, что он также сообщит о номерах строк. Итак, мой вопрос на самом деле заключается в том, как профилировать/оптимизировать код для PyPy в целом? - person Ecir Hana; 27.06.2013
comment
Это немного другой вопрос, чем вопрос выше, поэтому я снова спрашиваю здесь: stackoverflow.com/questions/17349822 /оптимизация для pypy - person Ecir Hana; 27.06.2013
comment
Если вам действительно нужна более высокая точность, чем функциональный уровень, у вас могут возникнуть проблемы с кодированием --- не делайте свои функции настолько большими, чтобы они содержали множество несвязанных циклов. Разделите их так, чтобы каждый в идеале делал только одно дело... - person Armin Rigo; 28.06.2013
comment
если функция содержит более одной строки, у меня снова возникает та же проблема. И я не думаю, что мне следует разбивать код на функции только для того, чтобы угодить профилировщику — я имею в виду, что есть законные функции, которые занимают несколько строк, и я хотел бы знать, какие строки являются проблемными. - person Ecir Hana; 28.06.2013
comment
Извините, я имел в виду: cProfile дает вам общие результаты для целых функций, да; но я не уверен, что построчные результаты будут иметь смысл с PyPy, потому что PyPy подобен компилятору C: он оптимизирует код так, что половина строки 2 выполняется в середине строки 4, строка 3 превращается в вообще никакого кода и т. д. Профилировщики Basic C также сообщают результаты только для каждой функции; чтобы получить более подробную информацию, вы должны разделить большую функцию C, содержащую два цикла, на две части. (Обратите внимание, что это не относится к более продвинутым профилировщикам, но их создание требует работы --- и для PyPy, извините, пока никто не сделал эту работу...) - person Armin Rigo; 28.06.2013
comment
Я уверен, что вы уже заметили, но LuaJIT только что получил профилировщик, который утверждает, что также работает построчно. Просто говорю, что кажется возможным сделать это... подробнее здесь: freelists.org/post/luajit/LuaJIT-21-Profiler-released - person Ecir Hana; 11.09.2013