Python уже содержит все, что вам нужно, чтобы сделать то, что вы описали, не нужно взламывать переводчик.
Вам просто нужно использовать модуль traceback
вместе с sys._current_frames()
функция.Все, что вам нужно, это способ выгрузки необходимых вам трассировок на нужной частоте, например, с помощью сигналов UNIX или другого потока.
Чтобы быстро запустить ваш код, вы можете делать именно то, что делается в this commit :
Скопируйте модуль threads.py
из этого коммита или хотя бы функцию дампа трассировки стека (лицензия ZPL, очень либеральная):
Подключите его к обработчику сигналов, скажем, SIGUSR1
Тогда вам просто нужнозапустите ваш код и «убейте» его с помощью SIGUSR1 так часто, как вам нужно.
Для случая, когда одна функция из одного потока время от времени «выбирается» одной и той же техникой, используя другой поток длявремя, я предлагаю анализировать код Products.LongRequestLogger и его тесты (разработанные вами по-настоящему, в то время как под управлением Nexedi ):
Является ли это правильным «статистическим» профилированием, ответ от Mike Dunlavey , на который ссылается intuited , убедительно доказывает, что это очень мощная техника «отладки производительности», и у меня есть личный опыт, который действительно помогает быстро увеличить реальные причины производительностивопросы.