Как я могу профилировать многопоточную программу на Python? - PullRequest
56 голосов
/ 17 марта 2009

Я разрабатываю многопоточный модуль на Python, и я хотел бы узнать, на что он тратит свое время. cProfile, кажется, только для профилирования основной темы. Есть ли способ профилирования всех потоков, участвующих в расчете?

Ответы [ 5 ]

35 голосов
/ 02 ноября 2009

Пожалуйста, смотрите yappi (еще один Python Profiler).

17 голосов
/ 17 марта 2009

Вместо запуска одного cProfile вы можете запустить отдельный экземпляр cProfile в каждом потоке, а затем объединить статистику. Stats.add() делает это автоматически.

7 голосов
/ 17 марта 2009

Если вы в порядке с небольшой дополнительной работой, вы можете написать свой собственный класс профилирования, который реализует profile(self, frame, event, arg). Это вызывается всякий раз, когда вызывается функция, и вы можете довольно легко настроить структуру для сбора статистики из этого.

Затем вы можете использовать threading.setprofile, чтобы зарегистрировать эту функцию в каждом потоке. Когда функция вызывается, вы можете использовать threading.currentThread(), чтобы увидеть, на каком она запущена. Более подробная информация (и готовый рецепт) здесь:

http://code.activestate.com/recipes/465831/

http://docs.python.org/library/threading.html#threading.setprofile

2 голосов
/ 18 марта 2009

Учитывая, что основные функции ваших потоков отличаются, вы можете использовать очень полезный profile_func() декоратор из здесь .

0 голосов
/ 17 марта 2009

Я не знаю ни одного приложения для профилирования, которое поддерживает такие вещи для python, но вы могли бы написать класс Trace, который записывает лог-файлы, в которые вы вводите информацию о том, когда операция начинается, когда она заканчивается и как много времени это заняло.

Это простое и быстрое решение вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...