Профилирование расширений python C
Я разработал C-расширение python, которое получает данные от python и вычисляет некоторые интенсивные вычисления процессора.
Можно ли профилировать C-расширение?
Проблема заключается в том, что писать образец теста на C, который должен быть профилирован, было бы сложным, потому что код полагался на определенные входы и структуры данных (сгенерированные кодом управления python).
Есть ли у вас какие-либо предложения?
Ответы
Ответ 1
Я нашел свой способ, используя google-perftools. Трюк состоял в том, чтобы обернуть функции StartProfiler и StopProfiler в python (в нашем случае ctyth cython).
Профилировать расширение C достаточно, чтобы обернуть код python внутри вызовов StartProfiler и StopProfiler.
from google_perftools_wrapped import StartProfiler, StopProfiler
impor c_extension # extension to profile c_extension.so
StartProfiler("output.prof")
... calling the interesting functions from the C extension module ...
StopProfiler()
Затем, чтобы проанализировать, например, вы можете экспортировать в формате callgrind и посмотреть результат в kcachegrind:
pprof --callgrind c_extension.so output.prof > output.callgrind
kcachegrind output.callgrind
Ответ 2
После комментария pygabriel я решил загрузить пакет в pypi, который реализует профайлер для расширений python, используя cpu-profiler из google-perftools: http://pypi.python.org/pypi/yep
Ответ 3
С gprof вы можете профилировать любую программу, которая была правильно скомпилирован и связан (gcc -pg
и т.д. в случае gprof
). Если вы используете версию Python, не построенную с помощью gcc
(например, предварительно скомпилированную версию Windows, распространяемую PSF), вам нужно исследовать, какие эквивалентные инструменты существуют для этой платформы и инструментальной цепочки (в случае Windows PSF, возможно, mingw
может помочь). Там могут быть "нерелевантные" данные (внутренние функции C в среде исполнения Python), и если это так, то проценты, показанные gprof
, могут быть неприменимы, но абсолютные числа (вызовов и продолжительности их) все еще остаются действителен, и вы можете выполнить пост-обработку вывода gprof
(например, с небольшим Python script;-), чтобы исключить нерелевантные данные и вычислить проценты, которые вы хотите.