Я хотел бы использовать statprof.py для профилирования кода в PyPy. К сожалению, он не работает, номера строк, на которые он указывает, отключены. Кто-нибудь знает, как заставить его работать или знает альтернативу?
Статистический профилировщик для PyPy
Ответы (1)
Вполне вероятно, что «номера строк отключены», потому что PyPy в JIT-коде будет встраивать многие функции и будет доставлять сигналы (здесь от таймера) только в конце циклов. Сравните это с CPython, который доставляет сигналы между двумя случайными байт-кодами — иногда и в конце цикла, но обычно где угодно. Итак, то, что вы получаете в PyPy, такое же, как и в CPython, если бы вы ограничили обработчики сигналов запускаться только в байт-коде «конец цикла».
Вот почему такой вид профилирования всегда пропускает множество функций, как и большинство функций без циклов.
Вы можете попробовать использовать встроенный модуль cProfile. Это, конечно, приводит к большему снижению производительности, чем статистическое профилирование, но все же попробуйте — например, это не мешает JITting, поэтому снижение производительности все равно должно быть разумным.
В более общем плане я не вижу простого способа реализовать аналог статистического профилирования в PyPy. Довольно сложно придать смысл при наличии функций, которые встраиваются друг в друга, а затем глобально оптимизируются... Мне было бы интересно, если бы вы могли обнаружить, что на самом деле существует инструмент для какого-то другого языка высокого уровня, выполняющий статистические профилирование на виртуальной машине с трассировкой JIT.
Мы могли бы записать достаточно информации, чтобы отследить каждую небольшую группу инструкций ассемблера до реальной функции Python, из которой она исходит, а затем использовать хаки для проверки текущего указателя инструкции (IP) на машинном уровне. Не невозможно, но серьезная работа :-)