Как профилировать комбинированный код Python и C - PullRequest
7 голосов
/ 29 октября 2010

У меня есть приложение, которое состоит из нескольких сценариев Python. Некоторые из этих скриптов вызывают код Си. Приложение теперь работает намного медленнее, чем было, поэтому я хотел бы профилировать его, чтобы увидеть, в чем проблема. Есть ли инструмент, пакет программ или просто способ профилировать такое приложение? Инструмент, который будет следовать за кодом Python в код C и профилировать эти вызовы?

Примечание 1. Мне хорошо известны стандартные инструменты профилирования Python. Я специально ищу здесь комбинированное профилирование Python / C.

Примечание 2: модули Python вызывают код C с использованием ctypes (см. http://docs.python.org/library/ctypes.html)).

Спасибо!

Ответы [ 2 ]

3 голосов
/ 29 октября 2010

Stackshots работа.Поскольку вы объединили Python и C, вы можете обрабатывать их отдельно.Для Python вы можете нажать Ctrl-C, пока медленнее исследовать стек.Сделайте это несколько раз.Это откроет все, что вы можете исправить в коде Python.Для кода C, запустите все это в отладчике, таком как GDB, и нажмите Ctrl-C, чтобы получить трассировку стека в C. Некоторые из них предоставят все, что вы можете исправить в C-коде.Мне сказали, что OProfile тоже может это сделать.(Другой способ - использовать lsstack , если он доступен.)

Это малоизвестный метод, работающий по этому принципу: предположим, у вас есть бесконечный цикл или почти бесконечный цикл.Как бы вы нашли это?Вы бы остановили программу и увидели, что она делает, верно?Предположим, что программа заняла в два раза больше времени, чем необходимо.Каждый раз, когда вы останавливаете его, вероятность того, что вы поймете это, выполняя ненужные вещи, составляет 50%.Так что все, что вам нужно сделать, это остановить его несколько раз.Как только вы увидите, что он делает что-то, что можно улучшить, всего за 2 образца, вы знаете, что можете исправить это для здорового ускорения.Затем вы можете повторить это, чтобы получить следующую проблему.Измерение не главное.Поймать вещи, которые вы можете улучшить, это главное.

1 голос
/ 29 октября 2010

Комбинация будет довольно сложной, но вы можете использовать некоторые стандартные профилировщики, такие как valgrind, gprof или даже oprofile (хотя мне так и не удалось получить значимый вывод из этого).

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